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])>
两者都不起作用。我做错了什么?
考虑关于位置的前瞻。
在 ^<(?!su[bp])>.+
中,您告诉引擎匹配此序列:
- 行首
- 一个
<
<
之后的位置不能跟sub或sup
- 一个
>
- 多个字符之一
第三个条件是你想错了。
您想要的正则表达式是:
^<(?!sub[bp]).+?>.+
所以你告诉引擎在 <
和 >
之间匹配尽可能少的字符(由 .+?
给出),但是 <
不应该然后是 sub 或 sup
您的模式不匹配,因为断言 (?!su[bp])
始终为真,因为模式匹配的下一件事是 >
。
因此第一个将匹配 <>a
,第二个将匹配 a</>
* 例如,假设字符 <
和 >
不能出现在结束 >
之前
如果你想要 2 个模式,在第一个模式中,你可以先匹配到结尾 >
,然后再匹配该行的其余部分。
^<(?!su[bp]\b)[^<>]+>.+
^
字符串开头
<
字面匹配
(?!su[bp]\b)
负前瞻,断言直接向右的不是 sub 或 sup
[^<>]+>
匹配除 <
和 >
以外的任何字符 1+ 次
.+
匹配任意字符 1 次以上
在第二个模式中你可以这样做,但是你必须匹配结束前的内容 >
因为前瞻是非消耗性的。
.+</(?!su[bp]\b)[^<>]+>$
.+
匹配任意字符 1 次以上
</
字面匹配
(?!su[bp]\b>)
负前瞻,断言直接向右的不是 sub 或 sup
[^<>]+
匹配除 <
和 >
以外的任何字符 1+ 次
$
字符串结束。
备注
- 使用
.+
是一个非常广泛的匹配,点将匹配任何字符。
- 如果您正在处理 html 或 xml 之类的结构化数据,我建议您改用解析器。
我想写两个 RegExp:第一个匹配以不是 或 的标签开头的字符串。然后是第二个匹配以不是 或 的标记结尾的字符串。
字符串 CH5 应与正则表达式匹配。
字符串 Something 不应匹配两个 RegExp 中的任何一个。
我认为 negative lookahead 可能值得一试,但不知怎的,它并没有像预期的那样工作。
对于 'starts with non-sub/sup-tag' 我使用了以下内容:^<(?!su[bp])>.+
对于 'ends with non-sub/sup-tag' 我使用了以下内容:.+(?!su[bp])>
两者都不起作用。我做错了什么?
考虑关于位置的前瞻。
在 ^<(?!su[bp])>.+
中,您告诉引擎匹配此序列:
- 行首
- 一个
<
<
之后的位置不能跟sub或sup- 一个
>
- 多个字符之一
第三个条件是你想错了。
您想要的正则表达式是:
^<(?!sub[bp]).+?>.+
所以你告诉引擎在 <
和 >
之间匹配尽可能少的字符(由 .+?
给出),但是 <
不应该然后是 sub 或 sup
您的模式不匹配,因为断言 (?!su[bp])
始终为真,因为模式匹配的下一件事是 >
。
因此第一个将匹配 <>a
,第二个将匹配 a</>
* 例如,假设字符 <
和 >
不能出现在结束 >
之前
如果你想要 2 个模式,在第一个模式中,你可以先匹配到结尾 >
,然后再匹配该行的其余部分。
^<(?!su[bp]\b)[^<>]+>.+
^
字符串开头<
字面匹配(?!su[bp]\b)
负前瞻,断言直接向右的不是 sub 或 sup[^<>]+>
匹配除<
和>
以外的任何字符 1+ 次
.+
匹配任意字符 1 次以上
在第二个模式中你可以这样做,但是你必须匹配结束前的内容 >
因为前瞻是非消耗性的。
.+</(?!su[bp]\b)[^<>]+>$
.+
匹配任意字符 1 次以上</
字面匹配(?!su[bp]\b>)
负前瞻,断言直接向右的不是 sub 或 sup[^<>]+
匹配除<
和>
以外的任何字符 1+ 次
$
字符串结束。
备注
- 使用
.+
是一个非常广泛的匹配,点将匹配任何字符。 - 如果您正在处理 html 或 xml 之类的结构化数据,我建议您改用解析器。