Регулярное выражение для соответствия. (точки, отмечающие конец предложений), но не мистер (как у мистера Хопкинса) - PullRequest
10 голосов
/ 01 июня 2010

Я пытаюсь разбить текстовый файл на предложения, заканчивающиеся периодами, но имена, подобные мистеру Хопкинсу, выдают ложные тревоги при сопоставлении для периодов.

Что регулярное выражение идентифицирует "." но не "мистер"

Для бонуса я тоже пользуюсь! чтобы найти конец предложений, поэтому мой текущий Regex - /(!/./ и я бы хотел получить ответ, включающий и мои!

Ответы [ 3 ]

12 голосов
/ 01 июня 2010

Используйте негативный взгляд позади .

(?<!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
6 голосов
/ 01 июня 2010

Это невозможно сделать с помощью любого простого механизма. Это безнадежно неоднозначно. Предложения могут заканчиваться аббревиатурами, и в этих случаях они не пишутся с двумя периодами.

См. Юникод TR29 . Также см. Библиотеку открытого исходного кода ICU, которая включает в себя базовую реализацию.

1 голос
/ 01 июня 2010

За вашими предложениями всегда следуют два пробела? Если это так, вы можете просто проверить это ...

/\.\s{2}/

и включая пунктуацию на другом конце предложения: /[\.\!\?]\s{2}/

Вы также можете проверить другие вещи, которые могут быть индикаторами конца предложения, например, если следующее слово написано заглавными буквами, идет ли оно после возврата каретки и т. Д. Но в лучшем случае вы просто сможете сделать обоснованное предположение, как указывалось выше, является слишком двусмысленным.

...