繁体   English   中英

为什么即使部分字符串处于负先行状态,该字符串也匹配

[英]Why does this string match even though parts of it are in negative lookahead

为什么这个正则表达式

(?!(public|private|protected|abstract|final|static))(.*)\\(\\);

匹配以下字符串:

public Test();

即使我说我想要一个空白空间,也没有 (public|...) ,然后是一些东西,然后是(); 我在这里做错了什么?

但是我想匹配这个: Test();

编辑:

为什么此方法不起作用(找不到匹配项),即使regex101.com匹配Test();

final String test = "public class Test {\n" +
        "  Test();\n";

final Pattern ptrn = Pattern.compile("^  (?!(public|private|protected|abstract|final|static))(.*)\\(\\);");
final Matcher mtchr = ptrn.matcher(test);

while(mtchr.find())
    System.out.println("FOUND");

问题

您遇到的问题显示在下面的代码段中。 正则表达式匹配,因为您的正则表达式未锚定到字符串中的某个位置。 这意味着正则表达式将尝试在字符串中的每个位置进行匹配。

正则表达式将首先尝试在public Test();中的p处进行匹配public Test(); 由于否定的前瞻包括public ,它将失败并尝试下一个位置: ublic Test(); u ublic Test(); 由于此位置不存在public和其他术语,因此成功匹配!

 var s = 'public Test();' var r = /(?!(public|private|protected|abstract|final|static))(.*)\\(\\);/ console.log(s.match(r)[0]) 

修复

那么我们该如何解决呢? 简单:锚定图案。 添加^锚会强制正则表达式从字符串开头开始匹配。 这意味着它将仅尝试从字符串的开头(在public Test();p的位置public Test();开始进行匹配,而不会尝试从字符串的开头不在的任何位置进行匹配(它不会尝试在u上进行匹配)。

查看正则表达式在这里使用

^(?!(public|private|protected|abstract|final|static))(.*)\(\);

 var a = [ 'public Test();', 'Test();' ] var r = /^(?!(public|private|protected|abstract|final|static))(.*)\\(\\);/ a.forEach(function(s) { console.log(r.test(s) ? s.match(r)[0] : '*** no match') }) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM