问题
我想从输入中提取单词
Pacific Gas & Electric (PG&E), San Diego Gas & Electric (SDG&E), Salt River Project (SRP), Southern California Edison (SCE)
我尝试在线和我的模式(\w\s?&?\s?\(?\)?)
seems to work。
但是当我编写Java程序时,它找不到它
private static void findWords() {
final Pattern PATTERN = Pattern.compile("(\\w\\s?&?\\s?\\(?\\)?)");
final String INPUT = "Pacific Gas & Electric (PG&E), San Diego Gas & Electric (SDG&E), Salt River Project (SRP), Southern California Edison (SCE)";
final Matcher matcher = PATTERN.matcher(INPUT);
System.out.println(matcher.matches());
}
返回False
问题
Pacific Gas & Electric (PG&E)
表示为匹配组1等等答案 0 :(得分:3)
如果您使用Matcher#find()
方法而不是Matcher#matches()
方法,则会获得true
作为结果。原因是,matches()
方法假设隐含锚点 - 克拉(^
)和美元($
)。所以它会将整个字符串与正则表达式匹配。如果不是这样,它将返回false
。
答案 1 :(得分:3)
您可能想要重新评估您从rubular获得的输出。
matches方法尝试将整个输入序列与模式匹配。
你在rubular中所拥有的东西找到了一堆匹配,因为几乎每个角色都匹配。
在你的rubular结果中没有任何地方它会告诉你整个字符串是匹配的。我会重新评估您在那里看到的结果。
和匹配单词的正则表达式非常简单
你可以使用
\b\S*\b
http://rubular.com/r/ljYs1xO1Qh
或只是
\S*
http://rubular.com/r/xgEuGse1lc
取决于您的需求
答案 2 :(得分:2)
Matcher#matches
仅返回true。
正如您在在线匹配器中看到的,您的正则表达式不匹配整个字符串而是匹配单个字符(有时更多)。所以你的正则表达式匹配" P"和" a"和" c"和"我"等等。您应首先修复正则表达式,然后使用Matcher#find()
和Matcher#group()
来获取匹配的组。
答案 3 :(得分:0)
如果你想从你的字符串中获取匹配项,这里你可以尝试:
final String INPUT = "Pacific Gas & Electric (PG&E), San Diego Gas & Electric (SDG&E), Salt River Project (SRP), Southern California Edison (SCE)";
Pattern pattern = Pattern.compile("(.*?\\([^)]+\\))(?:,\\s*|$)");
Matcher m = pattern.matcher(INPUT);
while (m.find()) {
System.out.println(m.group(1));
}
或者,如果名称中不包含任何逗号,则可以INPUT.split("\\s*,\\s*");
。
现在问题Why is there a mismatch, seems like my understanding is poor here
:因为String类的matches()
在整个字符串上执行匹配。