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

时间:2014-04-10 16:10:34

标签: java regex

问题

我想从输入中提取单词

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

问题

  1. 为什么会出现不匹配,似乎我的理解很差
  2. 如何将单词作为组输出,将Pacific Gas & Electric (PG&E)表示为匹配组1等等

4 个答案:

答案 0 :(得分:3)

如果您使用Matcher#find()方法而不是Matcher#matches()方法,则会获得true作为结果。原因是,matches()方法假设隐含锚点 - 克拉(^)和美元($)。所以它会将整个字符串与正则表达式匹配。如果不是这样,它将返回false

答案 1 :(得分:3)

您可能想要重新评估您从rubular获得的输出。

来自Documentation

  

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()在整个字符串上执行匹配。