IE的RegExp否定后向断言的替代方法

时间:2018-11-05 17:52:22

标签: javascript regex

关于向后寻找有很多问题,但是我找不到答案。

我的带有负向后视的RegExp在chrome中可以正常工作,但在IE中不能正常工作。

我需要一个在句号(。)之后匹配任何单词的正则表达式,但是在句号之前不应该有(Mr)。例如

'我今晚见过杰克先生。他是个好人。

我想得到他,但不想得到杰克(因为先生。)

到目前为止,我想出了以下regExp,它可以在chrome上正常工作,但不能在IE上运行。并且它将在IE上运行。

/(?<!Mr)\. *\b\w+\b/gi

现在,我需要这种可在IE上运行的正则表达式的替代方法。此后,我还需要免除(博士夫人)。

4 个答案:

答案 0 :(得分:1)

要实现这一目标的一种解决方法是反转字符串,然后使用否定的前瞻(所有浏览器都支持)-请参阅:https://stackoverflow.com/a/11347100/1954610

或者,您也可以在现有字符串上使用负数超前行-但这有点尴尬。这是仅排除Mr的解决方案:

/((?!Mr).{2}|^.?)\. *\b\w+\b/gi

尤其要注意在这里我要介绍的一些极端情况:匹配可以在0-1个字符之后发生,或者在两个不是“ Mr”的字符之后发生。

将其扩展为包含Dr很简单:

/((?![MD]r).{2}|^.?)\. *\b\w+\b/gi

但是,很难将其扩展为包括MrsMiss-因为您现在需要考虑不同长度的预见。这样的正则表达式最终会非常混乱。这是我的最佳尝试,但我并不完全相信它涵盖了所有极端情况。 (也许有人可以交叉检查吗?? ...

/(^.?|(?!Miss)(^|.)(?!Mrs)(^|.)(?![MD]r).{2})\. *\b\w+\b/

Demo

...或者,作为一种非常丑陋的解决方法,这里是一个正则表达式,用于测试字符串向后

\b\w+\b *\.(?!(rM|rD|srM|ssiM))

Demo

答案 1 :(得分:1)

您可以通过以下模式利用捕获组的功能:

bad_sequence|(good_sequence)

我们实际上确实匹配了不良内容,但是我们仅借助capturing parentheses来“记住”替换结果第二部分附近的有效结果。

这就是简单的了(请注意在第一部分中我们如何使用“仅分组” parens):

(?:Mr|Mrs|Miss|Dr)\.\s*|\.\s*(\w+)

您的“句号后面的有效单词”,are now in Group 1

答案 2 :(得分:1)

DEMO

(?!(?:Miss|Mr|Dr)\.)(?:\b\w+\b)(\. *\b\w+\b)

输入:

I met Mr. Jack this evening. He is a good man. And Miss. Jack is a good woman. Dr. Jack, how ever is not that great

输出:

. He
. And
. Dr

幸运的是,IE确实支持负面的展望。扩展模式\. *\b\w+\b以匹配.之前和之后的单词,可以使匹配与前瞻相反,并捕获第二部分。

答案 3 :(得分:0)

我将分两步执行此操作。步骤1,匹配不需要的单词,然后将它们替换为空字符串,然后准备对该字符串进行点分析。这是第一个正则表达式:

/(?:Mr|Mrs|Miss|Dr)\./gi

现在用空字符串替换那些匹配项。

现在将固定字符串与此正则表达式匹配:

/\s*\b\w+\b/gi

这将提供您想要的结果。