Я пытаюсь проанализировать текстовый файл в предложения, заканчивающиеся в периоды, но имена как г-н Hopkins бросают ложные аварийные сигналы на соответствие в течение многих периодов.
Что regex определяет ".", но не "г-н".
Для премии я также использую! найти конец предложений, таким образом, мой текущий Regex / (!/./и я любили бы ответ, который включает мой! также.
Использовать отрицательный просмотр за .
(?<!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
Всегда ли после предложений ставятся два пробела? Если да, вы можете просто проверить это ...
/ \. \ S {2} /
и включить знаки препинания в конце предложения:
/ [\. \! \?] \ S {2} /
Вы также можете проверить другие вещи, которые могут указывать на конец предложения, например, если следующее слово написано с заглавной буквы, следует ли за ним возврат каретки и т. д. Но в лучшем случае вы просто сможете сделать обоснованное предположение, как указывалось выше, точка слишком неоднозначна.
Это невозможно сделать с помощью какого-либо простого механизма. Это безнадежно двусмысленно. Предложения могут заканчиваться аббревиатурами, и в этих случаях они не пишутся с двумя периодами.
См. Unicode TR29. Также см. библиотеку ICU с открытым исходным кодом, которая включает базовую реализацию.