如何查找只有大写字母的单词(字符串)?
How to find words(strings) with only Uppercase letters?
我想知道,有什么函数或方法,如何从随机文本中select所有只有大写字母的单词(字符串)?更具体地说,我想从文本中取出所有大写单词并将它们放入一个字符串数组中,因为这些大写单词对我来说很重要。
例如来自文本:"This text was just made RANDOMLY to show what I MEANT."
在字符串数组中,我将包含单词 RANDOMLY
和 MEANT
。
数组应该是这样的String[] myArray = {"RANDOMLY", "MEANT"};
我唯一想到的是我已经搜索了每个字母并检查它是否大写,
如果是
- 将字母保存到字符串变量
- 将帮助整数变量 (
int count
) 的值增加一
- 看看下一个字母,
- 如果再次大写,重复这部分
- 如果不是 - 转到另一个字母。
我觉得我的solotion不是很有效,能说说你的看法吗?或者如何使它更有效?
PS:int count
是用来排除3个字母以下的短词的
用空格分割你的句子。然后你可以使用 StringUtils.isAllUpperCase(CharSequence cs)
来检查每一个字符串。
使用正则表达式提取它们。喜欢
public static void main(String[] args) {
List<String> words = new ArrayList<>();
String dataStr = "This text was just made RANDOMLY to show what I MEANT.";
Pattern pattern = Pattern.compile("[A-Z][A-Z]+");
Matcher matcher = pattern.matcher(dataStr);
while (matcher.find()) {
words.add(matcher.group());
}
System.out.println(words);
}
输出:
[RANDOMLY, MEANT]
以后有了这个,您只需调整搜索模式即可提取您想要的内容。
实现它的最简单方法可能是使用正则表达式,例如 \b[A-Z]{4,}\b
代表
\b
word boundary - 字母数字和非字母数字字符之间的位置
[A-Z]
character in range A-Z
{4,}
至少出现 4 次(如果我们不希望像 I
这样的单字母单词被计算在内)(更多信息位于:http://www.regular-expressions.info/repeat.html)
\b
另一个词边界以确保我们正在阅读整个词
因此您的代码可能如下所示:
String s = "This text was just made RANDOMLY to show what I MEANT.";
Pattern p = Pattern.compile("\b[A-Z]{4,}\b");
Matcher m = p.matcher(s);
while (m.find()) {
String word = m.group();
System.out.println(word);
}
除了将 word 打印到控制台外,您还可以将其存储在 List<String>
.
这是一个最少使用正则表达式的解决方案。
String s = "This text was just made RANDOMLY to show what I MEANT.";
String[] words = s.split(" |\.");
ArrayList<String> result = new ArrayList<>();
for(String word : words) {
String wordToUpperCase = word.toUpperCase();
if(wordToUpperCase.equals(word)) {
result.add(word);
}
}
代码行:
String[] words = s.split(" |\.");
表示字符串将被白色-space (" ") 或点(".")
分割
有关为什么需要破折号(转义)的更多信息:Java string split with "." (dot)
如果你只用白色-space分割字符串,像这样:
String[] words = s.split(" ");
它会留下可能令人讨厌的结果,例如 "MEANT."
在任何一种情况下,结果中都会包含单词 "I"。如果您不希望这样,请检查每个单词的长度是否大于 1。
我想知道,有什么函数或方法,如何从随机文本中select所有只有大写字母的单词(字符串)?更具体地说,我想从文本中取出所有大写单词并将它们放入一个字符串数组中,因为这些大写单词对我来说很重要。
例如来自文本:"This text was just made RANDOMLY to show what I MEANT."
在字符串数组中,我将包含单词 RANDOMLY
和 MEANT
。
数组应该是这样的String[] myArray = {"RANDOMLY", "MEANT"};
我唯一想到的是我已经搜索了每个字母并检查它是否大写,
如果是
- 将字母保存到字符串变量
- 将帮助整数变量 (
int count
) 的值增加一 - 看看下一个字母,
- 如果再次大写,重复这部分
- 如果不是 - 转到另一个字母。
我觉得我的solotion不是很有效,能说说你的看法吗?或者如何使它更有效?
PS:int count
是用来排除3个字母以下的短词的
用空格分割你的句子。然后你可以使用 StringUtils.isAllUpperCase(CharSequence cs)
来检查每一个字符串。
使用正则表达式提取它们。喜欢
public static void main(String[] args) {
List<String> words = new ArrayList<>();
String dataStr = "This text was just made RANDOMLY to show what I MEANT.";
Pattern pattern = Pattern.compile("[A-Z][A-Z]+");
Matcher matcher = pattern.matcher(dataStr);
while (matcher.find()) {
words.add(matcher.group());
}
System.out.println(words);
}
输出:
[RANDOMLY, MEANT]
以后有了这个,您只需调整搜索模式即可提取您想要的内容。
实现它的最简单方法可能是使用正则表达式,例如 \b[A-Z]{4,}\b
代表
\b
word boundary - 字母数字和非字母数字字符之间的位置[A-Z]
character in rangeA-Z
{4,}
至少出现 4 次(如果我们不希望像I
这样的单字母单词被计算在内)(更多信息位于:http://www.regular-expressions.info/repeat.html)\b
另一个词边界以确保我们正在阅读整个词
因此您的代码可能如下所示:
String s = "This text was just made RANDOMLY to show what I MEANT.";
Pattern p = Pattern.compile("\b[A-Z]{4,}\b");
Matcher m = p.matcher(s);
while (m.find()) {
String word = m.group();
System.out.println(word);
}
除了将 word 打印到控制台外,您还可以将其存储在 List<String>
.
这是一个最少使用正则表达式的解决方案。
String s = "This text was just made RANDOMLY to show what I MEANT.";
String[] words = s.split(" |\.");
ArrayList<String> result = new ArrayList<>();
for(String word : words) {
String wordToUpperCase = word.toUpperCase();
if(wordToUpperCase.equals(word)) {
result.add(word);
}
}
代码行:
String[] words = s.split(" |\.");
表示字符串将被白色-space (" ") 或点(".")
分割有关为什么需要破折号(转义)的更多信息:Java string split with "." (dot)
如果你只用白色-space分割字符串,像这样:
String[] words = s.split(" ");
它会留下可能令人讨厌的结果,例如 "MEANT."
在任何一种情况下,结果中都会包含单词 "I"。如果您不希望这样,请检查每个单词的长度是否大于 1。