关于向后寻找有很多问题,但是我找不到答案。
我的带有负向后视的RegExp在chrome中可以正常工作,但在IE中不能正常工作。
我需要一个在句号(。)之后匹配任何单词的正则表达式,但是在句号之前不应该有(Mr)。例如
'我今晚见过杰克先生。他是个好人。
我想得到他,但不想得到杰克(因为先生。)
到目前为止,我想出了以下regExp,它可以在chrome上正常工作,但不能在IE上运行。并且它将在IE上运行。
/(?<!Mr)\. *\b\w+\b/gi
现在,我需要这种可在IE上运行的正则表达式的替代方法。此后,我还需要免除(博士夫人)。
答案 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
但是,很难将其扩展为包括Mrs
和Miss
-因为您现在需要考虑不同长度的预见。这样的正则表达式最终会非常混乱。这是我的最佳尝试,但我并不完全相信它涵盖了所有极端情况。 (也许有人可以交叉检查吗?? ...
/(^.?|(?!Miss)(^|.)(?!Mrs)(^|.)(?![MD]r).{2})\. *\b\w+\b/
...或者,作为一种非常丑陋的解决方法,这里是一个正则表达式,用于测试字符串向后:
\b\w+\b *\.(?!(rM|rD|srM|ssiM))
答案 1 :(得分:1)
您可以通过以下模式利用捕获组的功能:
bad_sequence|(good_sequence)
我们实际上确实匹配了不良内容,但是我们仅借助capturing parentheses来“记住”替换结果第二部分附近的有效结果。
这就是简单的了(请注意在第一部分中我们如何使用“仅分组” parens):
(?:Mr|Mrs|Miss|Dr)\.\s*|\.\s*(\w+)
您的“句号后面的有效单词”,are now in Group 1。
答案 2 :(得分:1)
(?!(?: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
这将提供您想要的结果。