RegExp 中的 Negative Lookahead 未按预期工作

Negative Lookahead in RegExp not working as expected

我想写两个 RegExp:第一个匹配以不是 的标签开头的字符串。然后是第二个匹配以不是 或 的标记结尾的字符串。

字符串 CH5 应与正则表达式匹配。

字符串 Something 不应匹配两个 RegExp 中的任何一个。

我认为 negative lookahead 可能值得一试,但不知怎的,它并没有像预期的那样工作。

对于 'starts with non-sub/sup-tag' 我使用了以下内容:^<(?!su[bp])>.+

对于 'ends with non-sub/sup-tag' 我使用了以下内容:.+

两者都不起作用。我做错了什么?

考虑关于位置的前瞻。

^<(?!su[bp])>.+ 中,您告诉引擎匹配此序列:

  • 行首
  • 一个<
  • <之后的位置不能跟sub或sup
  • 一个>
  • 多个字符之一

第三个条件是你想错了。

您想要的正则表达式是:

^<(?!sub[bp]).+?>.+

所以你告诉引擎在 <> 之间匹配尽可能少的字符(由 .+? 给出),但是 < 不应该然后是 sub 或 sup

您的模式不匹配,因为断言 (?!su[bp]) 始终为真,因为模式匹配的下一件事是 >

因此第一个将匹配 <>a,第二个将匹配 a</>


* 例如,假设字符 <> 不能出现在结束 > 之前

如果你想要 2 个模式,在第一个模式中,你可以先匹配到结尾 >,然后再匹配该行的其余部分。

^<(?!su[bp]\b)[^<>]+>.+
  • ^ 字符串开头
  • <字面匹配
  • (?!su[bp]\b) 负前瞻,断言直接向右的不是 sub 或 sup
  • [^<>]+> 匹配除 <>
  • 以外的任何字符 1+ 次
  • .+ 匹配任意字符 1 次以上

Regex demo

在第二个模式中你可以这样做,但是你必须匹配结束前的内容 > 因为前瞻是非消耗性的。

.+</(?!su[bp]\b)[^<>]+>$
  • .+ 匹配任意字符 1 次以上
  • </字面匹配
  • (?!su[bp]\b>) 负前瞻,断言直接向右的不是 sub 或 sup
  • [^<>]+ 匹配除 <>
  • 以外的任何字符 1+ 次
  • $ 字符串结束。

Regex demo

备注

  • 使用 .+ 是一个非常广泛的匹配,点将匹配任何字符。
  • 如果您正在处理 html 或 xml 之类的结构化数据,我建议您改用解析器。