在Java中搜索任务需要您的帮助。 我需要从文件中读取一行,并列出所有包含大写字母超过1个字的单词。
例如,如果该行是:此UniverSe中有SeVen行星
结果应该是:SeVen和UniverSe
我能够通过将其分成单词来阅读该行,但有些人无法使用正确的正则表达式来搜索这些单词。
以下是我使用的一个小例子,但它返回false,虽然我认为它应该返回true。
的System.out.println( “这” .matches( “[A-Z] {2,}”));
任何人都可以看看这个并提出实现结果的方法吗? 感谢任何帮助。
谢谢,
AJ
答案 0 :(得分:7)
[A-Z]{2,}
表示连续2个或更多大写字母。你可以使用[A-Z].*[A-Z]
来允许任何其他字符出现在两个大写字母之间。
或者,您实际上不需要使用正则表达式。如果您愿意,可以迭代字符串中的每个字符并使用Character.isUpperCase
并计算匹配字符的数量。
答案 1 :(得分:2)
也许[a-z]*[A-Z][a-z]*[A-Z][a-z]*
可以工作..事实是用{..}
计数不允许两个字母之间的字符。
答案 2 :(得分:2)
\b(?:[a-z]*[A-Z]){2}[a-z]*\b
将匹配包含至少两个大写字母的单词。
如果要允许包含除ASCII之外的其他字母的单词,请使用
\b(?:\p{Ll}*\p{Lu}){2}\p{Ll}*\b
当然,在Java字符串中,您需要转义(双倍)反斜杠。
所以你得到:
Pattern regex = Pattern.compile("\\b(?:\\p{Ll}*\\p{Lu}){2}\\p{Ll}*\\b");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
// matched text: regexMatcher.group()
// match start: regexMatcher.start()
// match end: regexMatcher.end()
}
答案 3 :(得分:1)
您列出的正则表达式不起作用,因为它将搜索包含2个或更多大写字母的连续序列。
我认为您需要做的是编写一个表达式,允许您在两边都允许使用小写字母。
我不记得确切的语法(我要检查),但像.*[A-Z].*[A-Z].*
之类的东西会确保你有两个大写
答案 4 :(得分:0)
您当前的正则表达式仅匹配两个或更多大写字母的序列,而不是遍及整个单词的倍数。因此,您会发现匹配THis
和tHIS
但不匹配ThiS
。
你需要寻找一个大写字母,可能是一些小写字母,然后是另一个字母。或者在正则表达式中:[A-Z]\w*?[A-Z]
如果您想要搜索整个字符串而不需要先将其拆分,那么请在两端包含其他字符的可能性并让表达式捕获:(\w*?[A-Z]\w*?[A-Z]\w*)
另请注意,我们正在使用不情愿的量词,以便它们在前两个实例中尽早停止匹配,并在最后使用正常(贪婪)量词来获取其余单词。详细了解各种量词here。
答案 5 :(得分:0)
Pattern pat = Pattern.compile("\\w*[A-Z]\\w*[A-Z]\\w*");
Matcher matcher = pat.matcher("There are SeVen Planets In this UniverSe");
while ( matcher.find() ) {
System.out.println(matcher.group());
}
打印
SeVen
UniverSe
我对正则表达式很恐怖,所以可能有一种更简单的方法。这种方式很容易理解:从单词的开头开始,匹配0个或更多字符,然后是大写字符,然后是0个或更多字符,然后是另一个大写字符,然后是0个或更多个字符。
答案 6 :(得分:0)
我使用此正则表达式/[A-Z].[A-Z]+/
答案 7 :(得分:0)
您可以使用此正则表达式:
“SeVen”。匹配(“[A-Z]。 [A-Z] [a-zA-Z] ”)// true
“SeveNEight”。匹配(“[A-Z]。 [A-Z] [a-zA-Z] ”)// true
“seVeneight”。匹配(“[A-Z]。 [A-Z] [a-zA-Z] ”)//假