问题
我正在尝试从输入中提取单词
Pacific Gas & Electric (PG&E), San Diego Gas & Electric (SDG&E), Salt River Project (SRP), Southern California Edison (SCE)
我试着在网上这样做,我的模式(ws?&?s?(?)?)
似乎有效。
但当我写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,依此类推
如果使用Matcher#find()
方法而不是Matcher#matches()
方法,则会得到true
作为结果。原因是,matches()
方法在末端假设隐含锚——克拉(^
)和美元($
)。因此,它会将整个字符串与正则表达式相匹配。如果不是这样,它将返回false
。
您可能需要重新评估从rubular获得的输出。
来自文档
matches方法尝试将整个输入序列与模式进行匹配。
你在rubular中找到了一堆匹配,因为几乎每个角色都是匹配的。
在你的卢布结果中,它不会告诉你整个字符串是匹配的。我会重新评估你在那里看到的结果。
匹配单词的正则表达式是极其简单的
你可以使用
bS*b
http://rubular.com/r/ljYs1xO1Qh
或简称
S*
http://rubular.com/r/xgEuGse1lc
根据您的需要
Matcher#matches
只有在整个字符串与正则表达式匹配时才返回true。
正如您在在线匹配器中看到的,regex匹配的不是整个字符串,而是单个字符(有时会更多)。因此,您的正则表达式匹配"P"one_answers"a"、"c"one_answers"i"等等。您应该先修复正则表达式,然后使用Matcher#find()
和Matcher#group()
来获得匹配的组。
如果你想从字符串中提取匹配项,这里是你可以尝试的:
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()
对整个字符串执行匹配。