2010-07-22 73 views
1

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

例如,如果该行是:有七个行星在这个宇宙中

结果应该是:七和宇宙

我能够通过分裂成字读线,但一些如何不能够使用正确的正则表达式来搜索这些单词。

以下是我使用的一个小例子,但它返回false,但我认为它应该返回true。 System.out.println(“ThiS”.matches(“[A-Z] {2,}”));

任何人都可以请看看这个,并建议如何实现我的结果? 感谢任何帮助。

感谢,

AJ

+0

尝试用文字描述一个符合你想要的规则,然后再担心将它转换为正则表达式语法的细节。例如,“大写字母”的描述可能是“一个大写字母,后跟任意数量的小写字母”,您可以将其翻译为“^ [AZ] [az] * $” – 2010-07-22 16:11:34

回答

1

你列出的正则表达式是行不通的,因为它会搜索的2个或多个大写字母的连续序列。

我认为你需要做的是写一个表达式,让你在两边都允许使用小写字母。

我不记得确切的语法(我要去检查),但像.*[A-Z].*[A-Z].*将确保你有两个上的情况下

7

[A-Z]{2,}指2个或更多的连续大写字母。您可以使用[A-Z].*[A-Z]这将允许任何其他字符出现在两个大写字母之间。

另外,你并不需要使用正则表达式。如果你喜欢,你可以迭代字符串中的每个字符并使用Character.isUpperCase并计算匹配字符的数量。

+3

+1问题需要用正则表达式来解决“ – 2010-07-22 16:13:12

+0

我喜欢String迭代。这很简单,可以理解。 – extraneon 2010-07-22 16:13:32

+0

这将匹配'SeVen行星在这UniverS',懒惰它会匹配'SeV'。你需要用'\ b [A-Z]。*?[A-Z]。*?\ b'来定义单词边界,这非常低效。也许原子分组或展望未来会更好。 – NorthGuard 2010-07-22 16:25:48

2

也许[a-z]*[A-Z][a-z]*[A-Z][a-z]*可以工作..事实是,与{..}计数不允许两个字母之间的字符。

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() 
} 
0

您当前的正则表达式只有两个或多个大写字母,不倍数整个消息传开序列匹配。所以,你会匹配THistHIS,但不是你发现的ThiS

您需要查找大写字母,也许是小写字母,然后是另一个上部字母。或正则表达式:[A-Z]\w*?[A-Z]

如果你要搜索的整个字符串,而无需先被分割,然后包括在两端其他单词字符的可能性,并让表情捕捉:(\w*?[A-Z]\w*?[A-Z]\w*)

另外请注意,我们正在使用不情愿的量词,以便它们在前两个实例中尽早停止匹配,并在末尾选择正常(贪婪)量词来提取该词的其余部分。阅读更多关于各种量词here

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个或多个字符。

+0

因为单词字符无论如何都不匹配前面的非单词字符,所以不需要单词边界。 – MikeD 2010-07-22 16:15:58

+0

@MikeD,好点;当我把它放进去的时候,我最初并没有使用这个词。 – 2010-07-22 16:18:36

+0

嘿,马克......必须说你用正则表达式很棒!您提供的示例代码似乎正在运行:)非常感谢您的输入。 MikeJ,Jack,Uri,Tim和MikeD ...谢谢你们的快速回应 顺便说一句,正则表达式让我忘记了有多少行星实际上是:p 欣赏你所有的时间..再次感谢! -AJS – AJS 2010-07-22 16:41:59

0

我使用这个表达式/[A-Z].[A-Z]+/

+0

最好是'/ [A-Z]。[A-Z] + /'?我认为你提出的正则表达式会匹配'AbC'而不是'AbcD'。 – Barranka 2015-01-14 15:59:54

0

可以使用这个表达式:( “[AZ] [AZ] [A-ZA-Z]”)

“七” .matches //真

“SeveNEight” .matches(“[AZ]。[AZ] [A-ZA-Z] ”)//真

“seVeneight” .matches(“[AZ]。[ AZ] [a-zA-Z]“)// false

相关问题