3

有人可以给我一个例子/解释这个正则表达式的作用:

(?![#$])

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

我检查了文档,发现(?! ...)意味着零宽度负前瞻,但我不完全确定我理解这意味着什么。到目前为止,我尝试的任何输入<% ... %>似乎都有效 - 我想知道为什么第一个子表达式甚至在那里。

编辑: 我想出了这个表达式来获取 ASP.NET 表达式:<%.+?%>然后我找到了微软制作的那个(上面有问题的完整表达式)。我试图理解为什么他们选择那个特定的表达方式,而我的表达方式似乎更简单。(我想看看我的表达式是否忽略了 MS 没有的某些边界条件。)

4

1 回答 1

4

这是一个否定的先行断言,如果下一个字符不是#or则匹配$,但不消耗它。

它与否定字符类非常相似,[^#$]只是否定字符类也消耗字符,防止它与表达式的其余部分匹配。

要查看差异,请考虑匹配<%test%>

  • 表达式<%(?![#$])(([^%]*)%)*?>捕获test%. (红字)
  • 表达式<%[^#$](([^%]*)%)*?>捕获est%,因为t被否定字符类消耗。(红字)
于 2012-04-27T06:35:23.463 回答