Java RegEx负面的lookbehind

时间:2013-08-02 11:29:17

标签: java regex regex-lookarounds

我有以下Java代码:

Pattern pat = Pattern.compile("(?<!function )\\w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());

为什么mat.find()会返回true?我使用了负面的lookbehind,example前面是function。它不应该被丢弃吗?

3 个答案:

答案 0 :(得分:31)

查看匹配内容:

public static void main(String[] args) throws Exception {
    Pattern pat = Pattern.compile("(?<!function )\\w+");
    Matcher mat = pat.matcher("function example");
    while (mat.find()) {
        System.out.println(mat.group());
    }
}

输出:

function
xample

首先它找到function,前面没有“function”。然后它会找到xample,前面有function e,因此不是“function”。

据推测,您希望模式与整个文本相匹配,而不仅仅是在文本中找到匹配的

您可以使用Matcher.matches()执行此操作,也可以更改模式以添加开始和结束锚点:

^(?<!function )\\w+$

我更喜欢第二种方法,因为它意味着模式本身定义了匹配区域,而不是由其用法定义的区域。然而,这只是一个偏好问题。

答案 1 :(得分:1)

您的字符串的单词“function”与\ w +匹配,并且前面没有“function”。

答案 2 :(得分:1)

请注意两件事:

  • 您正在使用find()返回 true 以获取子字符串匹配。

  • 由于上述原因,“功能”匹配,因为它没有“功能” 整个字符串永远不会匹配,因为你的正则表达式没有 包括空格。

使用带有否定前瞻的Mathcher#matches()^$个锚点:

Pattern pat = Pattern.compile("^(?!function)[\\w\\s]+$"); // added \s for whitespaces
Matcher mat = pat.matcher("function example");

System.out.println(mat.find()); // false