2011-02-10 21 views
6

Chcę podzielić tekst na zdania. Zdanie kończy się na (kropka) lub? lub! następnie następuje jeden lub więcej znaków odstępu, a następne zdanie zaczyna się od dużej litery. Na przykład: Na przykład:Podziel tekst na zdania w C#

Pierwsze zdanie. Drugie zdanie!

Jak mogę to zrobić?

+12

Jak sobie z tym poradzisz: * "Kiedy przyszedł do domu, krzyknął:" Hej! Czy ktoś tam jest? ", A następnie otworzył drzwi i wszedł do środka." * Czy masz bardzo ścisłą kontrolę nad danymi wejściowymi? –

+0

Dodałem wyrażenie regularne w mojej answear, które uwzględnia tę sprawę. Ref http://www.regexlib.com/REDetails.aspx?regexp_id=2355 – Thea

+0

@Fredrik Mörk Twój przykład jest szczególnie interesujący. Poradziłbym sobie jako jedno zdanie – Lato

Odpowiedz

4

Jakie języki chcesz wspierać? Na przykład w języku tajskim nie ma spacji między wyrazami, a zdania są oddzielone spacją. Zasadniczo zadanie to jest bardzo złożone. Rozważ także przydatny komentarz Fredrika Mörka.

Najpierw należy zdefiniować zestaw reguł określających "zdanie". Następnie zapraszamy do skorzystania z jednego z sugerowanych rozwiązań.

+1

Chcę wspierać głównie angielski. Istnieje wiele określonego stanu. na przykład muszę rozważyć skróty (Dr Jekyll) – Lato

+0

dziękuję bardzo! – Lato

5

Czy próbowałeś już String.Split()? Zobacz docs o to here

+3

tak, ale to nie wystarcza. W tekście znajdują się linki. (Np .: www.mysite.it) – Lato

5

Spróbuj tego (MSDN)

char[] separators = new char[] {'!', '.', '?'}; 
string[] sentences1 = "First sentence. Second sentence!".Split(separators); 
//or... 
string[] sentences2 = "First sentence. Second sentence!".Split('!', '.', '?'); 
24

Można podzielić na wyrażeniem regularnym dopasowującym białą przestrzeń, z lookbehind że szuka terminatorów zdanie:

string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+"); 

Spowoduje to podział na białe znaki i zachowanie terminatorów w zdaniach.

Przykład:

string input = "First sentence. Second sentence! Third sentence? Yes."; 
string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+"); 

foreach (string sentence in sentences) { 
    Console.WriteLine(sentence); 
} 

wyjściowa:

First sentence. 
Second sentence! 
Third sentence? 
Yes. 
+1

dziękuję, dziękuję, dziękuję !!!!!!!!!!!!! dziękuję, dziękuję, dziękuję ... dziękuję za tonę ... potrzebowałem tego źle .. borykałem się z funkcją string.split(), która alouje tylko jedną postać. –

+1

Należy zachować ostrożność, ponieważ nie zadziała w przypadku rzeczy typu "Hello Mr. & Mrs. Smith". – Yodacheese

+0

@Yodacheese: Tak, to prawda. Wymagałoby to znacznie bardziej zaawansowanej analizy znaczenia zdania, aby złapać, gdy okres faktycznie kończy zdanie. Rozważmy na przykład zdania: "Honorowym jest Pan Smith to nazwisko". – Guffa