这个正则表达式 (?![#$]) 是什么意思?

3

有人能给我举个例子或者解释一下这个正则表达式的作用:

(?![#$])

这是<%(?![#$])(([^%]*)%)*?>的一部分,这是ASP.NET用于解析服务器端代码块的。我理解了表达式的第二部分,但不理解第一部分。

我查阅了文档,发现(?! ...)表示一个零宽度的负向先行断言,但我不确定我是否完全理解了它的含义。到目前为止,我尝试了所有看起来像<% ... %>的输入都有效--我想知道为什么这个子表达式甚至存在。

编辑: 我想出了一个选择ASP.NET表达式的表达式:<%.+?%>,然后我找到了微软制作的那个(上述完整表达式)。我试图理解为什么他们选择了这个特定的表达式,当我的表达式看起来要简单得多。(我试图看看我的表达式是否忽略了微软的某些边界条件。)


1
正则表达式:<%(?![#$])(([^%]*)%)*?> - 新的 APL:⎕←{⍵⍨~{⍵∨≠\⍵}⍵∊'<>'}txt - Michael Burr
1个回答

4
它是一个负向前瞻断言,如果下一个字符不是#$,则匹配成功,但不消耗它。
它与负字符类[^#$]非常相似,但负字符类也会吞掉字符,防止其被表达式的其余部分匹配。
要看到区别,请考虑匹配<%test%>
  • 表达式<%(?![#$])(([^%]*)%)*?>捕获test%(rubular)
  • 表达式<%[^#$](([^%]*)%)*?>捕获est%,因为t被负字符类吞掉了。(rubular)

马克,谢谢你的回答。有没有一个不匹配这个正则表达式的例子?我问这个是因为我想知道为什么这比只使用<%.+?%>更好。到目前为止,我尝试过的所有示例似乎都以相同的方式匹配两者。 - xxbbcc
@xxbbcc: <%#这不应该匹配%> - Mark Byers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接