Регулярное выражение для соответствия. (точки, обозначающие конец предложения), но не мистер (как в мистере Хопкинсе)

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

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

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


person Josh Crews    schedule 31.05.2010    source источник
comment
А как насчет других сокращений (например, Ms.), аббревиатур со знаками препинания (A.C.M.E.) или многоточия (...)?   -  person James McNellis    schedule 01.06.2010
comment
Если бы кто-то знал, как это сделать, мистер, это бы меня продвинуло вперед.   -  person Josh Crews    schedule 01.06.2010


Ответы (3)


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

(?<!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
person Amarghosh    schedule 01.06.2010
comment
Я знал человека, который жил на Линкольн-Др. Я жил на Альберт-роуд. - person Windows programmer; 04.06.2010
comment
Хорошо, я слишком много жалуюсь, потому что эта проблема разрешима для мистера. Она терпит неудачу только в том случае, если у доктора мисс нет месячных, а мисс и миссис работают. - person Windows programmer; 04.06.2010
comment
Возможно ли это без отрицательного взгляда назад? Мое веб-приложение не работает, потому что IOS Safari не поддерживает регулярное выражение просмотра назад. - person Ariel Frischer; 18.10.2020

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

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

person bmargulies    schedule 31.05.2010

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

/\.\s{2}/

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

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

person Rob    schedule 01.06.2010