我正在尝试将文本文件解析为以句点结尾的句子,但像霍普金斯先生这样的名字会在匹配期间抛出错误警报。
正则表达式标识“。”但不是“先生。”
奖金,我也在使用!为了找到句子的结尾,所以我现在的正则表达式是/(!/。/我想要一个包含我的答案的答案。
答案 0 :(得分:12)
(?<!Mr|Mrs|Dr|Ms)\.
只有在Mr
,Mrs
,Dr
或Ms
<?
$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}/
您还可以查看其他可能是句子结尾指示的内容,例如下一个单词是否大写,是否后跟回车等等。但最多只能创建一个有根据的猜测,如上所述,这个时期太过模糊了。