正则表达式匹配。 (标记句末的句号)但不是先生(如霍普金斯先生)

时间:2010-05-31 21:31:48

标签: regex regex-negation

我正在尝试将文本文件解析为以句点结尾的句子,但像霍普金斯先生这样的名字会在匹配期间抛出错误警报。

正则表达式标识“。”但不是“先生。”

奖金,我也在使用!为了找到句子的结尾,所以我现在的正则表达式是/(!/。/我想要一个包含我的答案的答案。

3 个答案:

答案 0 :(得分:12)

使用negative look behind

(?<!Mr|Mrs|Dr|Ms)\.

只有在MrMrsDrMs

之后才会出现这段时间
<?
   $str = "This is Mr. Someone and Mrs. Somebody. They are here to meet Dr. SomeoneElse.";
   $str = preg_replace("/(?<!Mr|Mrs|Dr|Ms)\\./", "\n", $str);
   echo($str);
?>
//outputs:
This is Mr. Someone and Mrs. Somebody
 They are here to meet Dr. SomeoneElse

答案 1 :(得分:6)

使用任何简单的机制都无法做到这一点。它毫无希望地模糊不清。句子可以用缩写结尾,在这些情况下,它们不是用两个句子写的。

Unicode TR29。另请参阅ICU开源库,其中包括基本实现。

答案 2 :(得分:1)

你的句子总是跟着两个空格吗?如果是这样,你可以检查一下......

/\.\s{2}/

并加入句子标点符号的其他结尾: /[\.\!\?]\s{2}/

您还可以查看其他可能是句子结尾指示的内容,例如下一个单词是否大写,是否后跟回车等等。但最多只能创建一个有根据的猜测,如上所述,这个时期太过模糊了。