Regex для соответствия. (периоды, отмечая конец предложений), но не г-н (как в г-не Hopkins)

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

Что regex определяет ".", но не "г-н".

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

10
задан Carl Manaster 1 June 2010 в 04:17
поделиться

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
12
ответ дан 3 December 2019 в 20:03
поделиться

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

/ \. \ S {2} /

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

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

1
ответ дан 3 December 2019 в 20:03
поделиться

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

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

6
ответ дан 3 December 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: