Java - 搜索大写字母超过1的单词

时间:2010-07-22 16:03:08

标签: java regex search

在Java中搜索任务需要您的帮助。 我需要从文件中读取一行,并列出所有包含大写字母超过1个字的单词。

例如,如果该行是:此UniverSe中有SeVen行星

结果应该是:SeVen和UniverSe

我能够通过将其分成单词来阅读该行,但有些人无法使用正确的正则表达式来搜索这些单词。

以下是我使用的一个小例子,但它返回false,虽然我认为它应该返回true。

的System.out.println( “这” .matches( “[A-Z] {2,}”));

任何人都可以看看这个并提出实现结果的方法吗? 感谢任何帮助。

谢谢,

AJ

8 个答案:

答案 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)

您当前的正则表达式仅匹配两个或更多大写字母的序列,而不是遍及整个单词的倍数。因此,您会发现匹配THistHIS但不匹配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] ”)//假