![](/img/trans.png)
[英]Using zero-width assertions negative lookahead to match a string that does's contains string “abc”
[英]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.