Java RegEx 负值隐藏

2022-09-02 09:19:52

我有以下Java代码:

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

为什么返回 true?我使用了否定的 lookbehind,前面是 .难道不应该丢弃吗?mat.find()examplefunction


答案 1

看看它匹配什么:

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

所以首先它找到 ,它前面没有 “”。然后它找到哪个前面是“”,因此不是“”。functionfunctionxamplefunction efunction

大概您希望模式与整个文本匹配,而不仅仅是在文本中查找匹配项。

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

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

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


答案 2

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