8

如何在 Java 正则表达式中匹配多个空格字符?

我有一个我想匹配的正则表达式。当我有两个或更多空格字符时,正则表达式失败。

public static void main(String[] args) { 
    String pattern = "\\b(fruit)\\s+([^a]+\\w+)\\b"; //Match 'fruit' not followed by a word that begins with 'a'
    String str = "fruit apple"; //One space character will not be matched
    String str_fail = "fruit  apple"; //Two space characters will be matched
    System.out.println(preg_match(pattern,str)); //False (Thats what I want)
    System.out.println(preg_match(pattern,str_fail)); //True (Regex fail)
}

public static boolean preg_match(String pattern,String subject) {
    Pattern regex = Pattern.compile(pattern);
    Matcher regexMatcher = regex.matcher(subject);
    return regexMatcher.find();
}
4

1 回答 1

12

问题实际上是因为回溯。你的正则表达式:

 "\\b(fruit)\\s+([^a]+\\w+)\\b"

说“水果,后跟一个或多个空格,后跟一个或多个非'a'字符,后跟一个或多个'word'字符”。两个空格失败的原因是因为\s+匹配第一个空格,但随后返回第二个,然后满足[^a]+(与第二个空格)和\s+部分(与第一个)。

我认为您可以通过简单地使用构成量词来解决它,这将是\s++. 这告诉\s 不要返回第二个空格字符。您可以在此处找到有关 Java 量词的文档。


作为说明,以下是 Rubular 的两个示例:

  1. 使用所有格量词\s(根据您的描述给出预期的结果)
  2. 您当前的正则表达式在[^a\]+\w+周围有单独的分组。请注意,第二个匹配组(代表[^a]+)正在捕获第二个空格字符。
于 2012-06-07T15:00:32.167 回答