2010-05-31 9 views
10

Próbuję parsować plik tekstowy na zdania kończące się kropkami, ale nazwiska takie jak Mr. Hopkins rzucają fałszywe alarmy o dopasowywaniu okresów.Regex do dopasowania. (okresy oznaczające koniec zdania), ale nie pan (jak w Mr. Hopkins)

Co regex oznacza "." ale nie "Pan"

Do bonusu używam również! aby znaleźć koniec zdań, więc mój obecny Regex to /(!/./ i bardzo chciałbym odpowiedzi, która zawiera także moje !.

+0

Co z innymi znakami (np: "Pani"), przerywane akronimów ("ACME ") lub elipsy (" ... ")? –

+0

'Pani'? 'Ms.'? 'Dr.'? – kennytm

+0

Jeśli ktoś wie, jak to zrobić, to dostanę mnie do przodu. –

Odpowiedz

12

Użyj negative look behind.

(?<!Mr|Mrs|Dr|Ms)\. 

To dopasuje okres tylko wtedy, gdy nie przychodzi po Mr, Mrs, Dr lub 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 
+3

Znałem kogoś, kto mieszkał na Lincolnie Dr. żyłem na Albert Rd. –

+0

OK, narzekam za dużo, ponieważ ten problem jest rozwiązany dla pana. To się tylko nie udaje na dr Miss nie ma okresu, a pani i pani pracują. –

6

Nie da się tego zrobić za pomocą prostego mechanizmu, beznadziejnie dwuznacznego . zdania może kończyć się skrótów, iw tych przypadkach nie są one pisane z dwóch okresów.

Zobacz Unicode TR29. patrz także bibliotekę ICU open source, która zawiera podstawowe wdrożenie.

1

Czy twoje zdania zawsze następuje przez dwie spacje? Jeśli tak, możesz to sprawdzić ...

/\.\s{2}/

i włączenie drugi koniec zdanie interpunkcyjne /[\.\!\?]\s{2}/

Można również sprawdzić inne rzeczy, które mogą być wskaźniki końcu zdania, podobnie jak wtedy, gdy następny wyraz jest aktywowane, jest to następuje powrót karetki itp. Ale w najlepszym razie będziesz w stanie przeprowadzić domysły, ponieważ powyższy okres jest zbyt niejednoznaczny.

Powiązane problemy