我有以下Java代码:
Pattern pat = Pattern.compile("(?<!function )\\w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());
为什么mat.find()
会返回true?我使用了负面的lookbehind,example
前面是function
。它不应该被丢弃吗?
答案 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