繁体   English   中英

替代IE的RegExp负向lookbehind断言

[英]Alternative to RegExp negative lookbehind assertion for IE

关于lookbehind有很多问题,但我找不到答案。

带有负面lookbehind的我的RegExp在chrome中运行良好,但在IE中却没有。

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

“我今晚见到杰克先生。 他是一个好人'

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

到目前为止,我已经提出了以下regExp,它在chrome上工作正常,但它不适用于IE。 它将在IE上运行。

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

现在我需要替代这个适用于IE的正则表达式。 在此之后我还需要免除(小姐博士)。

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

或者,您也可以在现有字符串上使用否定前瞻 - 但它有点尴尬。 这是一个只排除Mr的解决方案:

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

特别要注意我必须覆盖的边缘情况:匹配可以在0-1个字符之后,或者在不是“Mr”的2个字符之后发生。

将此扩展为包含Dr非常简单:

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

然而,将此扩展到包括MrsMiss要困难得多 - 因为您现在需要考虑不同长度的预测 这样的正则表达式最终会让人感到困惑。 这是我最好的尝试,但我并不完全相信它涵盖了所有边缘情况。 (也许如果有人可以交叉检查它?...)

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

演示

......或者,固然是一个非常丑陋的解决方法,这里有一个正则表达式向后测试字符串:

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

演示

您可以使用此模式使用捕获组的功能:

bad_sequence|(good_sequence)

我们实际上匹配了不好的东西,但我们只是通过围绕交替的第二部分捕获括号来“记住”有效结果。

所以它就变成了这个(注意我们在第一部分中如何使用'仅分组'parens):

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

你的“一段时间后的有效词汇”, 现在是第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 \\. *\\b\\w+\\b匹配前后的单词. 允许你取消前面的匹配,并捕获第二部分。

我会分两步完成。 步骤1,匹配不需要的单词,然后用空字符串替换它们,然后准备好字符串解析点。 这是第一个正则表达式:

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

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

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

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

这将给出你想要的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM