Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-搜索超过1个大写字母的单词_Java_Regex_Search - Fatal编程技术网

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

Java-搜索超过1个大写字母的单词,java,regex,search,Java,Regex,Search,只需要您在Java中搜索任务方面的帮助。 我需要从一个文件中读一行,列出所有超过1个大写字母的单词 例如,如果这条线是:这个宇宙中有七颗行星 结果应该是:七和宇宙 我可以通过将行拆分为单词来阅读,但有些人无法使用正确的正则表达式来搜索这些单词 下面是我使用的一个小示例,但它返回false,尽管我认为它应该返回true System.out.println(“ThiS.matches”([A-Z]{2,}”) 任何人都可以看看这个,并提出实现我的结果的方法吗? 谢谢你的帮助 谢谢 AJ您列出的正则

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

例如,如果这条线是:这个宇宙中有七颗行星

结果应该是:七和宇宙

我可以通过将行拆分为单词来阅读,但有些人无法使用正确的正则表达式来搜索这些单词

下面是我使用的一个小示例,但它返回false,尽管我认为它应该返回true

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

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

谢谢


AJ

您列出的正则表达式不起作用,因为它将搜索由2个或更多大写字母组成的连续序列

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


我不记得确切的语法(我要检查一下),但是类似于
*[A-Z].[A-Z].
的东西将确保您有两个大写字母

您列出的正则表达式不起作用,因为它将搜索两个或更多大写字母的连续序列

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


我不记得确切的语法(我要检查一下),但是类似于
*[A-Z].[A-Z].
的东西将确保您有两个大写字母

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


或者,您也不需要为此使用正则表达式。如果愿意,您可以在字符串中的每个字符上迭代并使用
字符。isUpperCase
并计算匹配字符的数量。

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


或者,您也不需要为此使用正则表达式。如果愿意,您可以在字符串中的每个字符上迭代并使用
字符。isUpperCase
并计算匹配字符的数量。

也许
[a-z]*[a-z][a-z]*[a-z][a-z]*
可以工作。。事实上,用
{..}
计数不允许两个字母之间有字符。

也许
[a-z]*[a-z][a-z]*[a-z][a-z]*
可以工作。。事实上,使用
{..}
进行计数时,两个字母之间不允许使用字符

\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()
}
将匹配至少包含两个大写字母的单词

如果要允许包含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()
}

您当前的正则表达式只匹配两个或更多大写字母的序列,而不是分布在整个单词中的倍数。因此,您可以匹配
这个
这个
,但不能像您所发现的那样匹配
这个

你需要寻找一个大写字母,可能是一些小写字母,然后是另一个大写字母。或者在正则表达式中:
[A-Z]\w*?[A-Z]

如果要搜索整个字符串而不需要首先拆分它,则可以在任意一端包含其他单词字符,并让表达式捕获:
(\w*?[A-Z]\w*?[A-Z]\w*)


还要注意的是,我们使用的是不情愿的量词,以便它们在前两个实例中尽早停止匹配,并在末尾使用正常(贪婪)量词来拾取单词的其余部分。阅读有关各种量词的更多信息。

您当前的正则表达式只匹配两个或更多大写字母的序列,而不是散布在整个单词中的倍数。因此,您可以匹配
这个
这个
,但不能像您所发现的那样匹配
这个

你需要寻找一个大写字母,可能是一些小写字母,然后是另一个大写字母。或者在正则表达式中:
[A-Z]\w*?[A-Z]

如果要搜索整个字符串而不需要首先拆分它,则可以在任意一端包含其他单词字符,并让表达式捕获:
(\w*?[A-Z]\w*?[A-Z]\w*)

还要注意的是,我们使用的是不情愿的量词,以便它们在前两个实例中尽早停止匹配,并在末尾使用正常(贪婪)量词来拾取单词的其余部分。阅读更多有关各种量词的信息

印刷品

SeVen
UniverSe
我对正则表达式很讨厌,所以可能有一个更简单的方法。但是,这种方法很容易理解:从单词的开头开始,匹配0个或更多字符,然后匹配一个大写字符,然后匹配0个或更多字符,然后匹配另一个大写字符,然后匹配0个或更多字符

印刷品

SeVen
UniverSe

我对正则表达式很讨厌,所以可能有一个更简单的方法。但是,这种方法很容易理解:从单词的开头开始,匹配0个或更多字符,然后匹配一个大写字符,然后匹配0个或更多字符,然后匹配另一个大写字符,然后匹配0个或更多字符

我使用这个正则表达式
/[A-Z].[A-Z]+/
我使用这个正则表达式
/[A-Z].[A-Z]+/
你可以使用这个正则表达式:

“七”。匹配(“[A-Z].[A-Z][A-zA-Z]”),正确

“SeveNEight”。匹配(“[A-Z].[A-Z][A-zA-Z]”),正确


“seVeneight”。匹配(“[A-Z].[A-Z][A-zA-Z]”//false

您可以使用此正则表达式: