【问题标题】:What does this regular expression mean: (?![#$])这个正则表达式是什么意思:(?![#$])
【发布时间】:2012-05-07 22:04:08
【问题描述】:

谁能给我一个例子/解释这个正则表达式的作用:

(?![#$])

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

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

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

【问题讨论】:

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

标签: asp.net .net regex


【解决方案1】:

如果下一个字符不是#$,则匹配negative lookahead assertion,但不使用它。

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

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

  • 表达式<%(?![#$])(([^%]*)%)*?> 捕获test%(rubular)
  • 表达式<%[^#$](([^%]*)%)*?> 捕获est%,因为t 已被否定字符类占用。 (rubular)

【讨论】:

  • 马克,谢谢你的回答。有没有与此正则表达式不匹配的示例?我之所以问,是因为我试图理解为什么这比仅使用 <%.+?%> 更好。到目前为止,我尝试的所有示例似乎都以相同的方式匹配。
  • @xxbbcc: <%#thisshouldntmatch%>
  • 谢谢,你的解释很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多