Java正则表达式不起作用,同样的模式也适用于在线网站



问题

我正在尝试从输入中提取单词

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

问题

  1. 为什么会有不匹配,似乎我的理解力很差
  2. 如何将单词分组,将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()对整个字符串执行匹配。