2011-02-10 1 views
6

Я хочу разделить текст на предложения. Предложение заканчивается (точкой) или? или ! после чего следует один или несколько пробельных символов, а следующее предложение начинается с буквы верхнего регистра.Разделить текст на предложения в C#

Например:

Первое предложение. Второе предложение!

Как я могу это сделать?

+12

Как бы вы справились с этим: * «Когда он подошел к дому, он крикнул:« Эй! Кто-нибудь есть? », А затем открыл дверь и вошел». * Или у вас есть очень строгий контроль над входом? –

+0

Я добавил регулярное выражение в мой ответ, который рассматривает этот случай. Ref http://www.regexlib.com/REDetails.aspx?regexp_id=2355 – Thea

+0

@Fredrik Mörk Ваш пример - особенно интересный случай. Я бы рассматривал как одно предложение – Lato

ответ

4

Какие языки вы хотите поддержать? Например, на тайском языке между словами нет пробелов, а предложения разделены пробелом. Итак, в общем, эта задача очень сложная. Также рассмотрите полезный комментарий Фредрика Мёрка.

Итак, сначала вам необходимо определить набор правил, в которых «предложение». Затем вы можете использовать одно из предлагаемых решений.

+1

Я хочу поддерживать в основном английский. Существует много особого состояния. например, я должен рассмотреть Сокращения (д-р Jekyll) – Lato

+0

большое спасибо! – Lato

5

Вы попробовали String.Split()? Смотрите документацию об этом here

+3

да, но этого недостаточно. В тексте есть ссылки. (Пример: www.mysite.it) – Lato

5

Попробуйте это (MSDN)

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

Вы можете разделить на регулярное выражение, которое соответствует пустое пространство, с просмотром назад, который ищет приговор терминаторов:

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

Это разделится на символы пробела и сохранит термины в предложениях.

Пример:

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

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

Выход:

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

спасибо спасибо спасибо !!!!!!!!!!!!! Благодарю вас благодарю вас .. спасибо тонну ... нужно было это плохо ... он боролся с функцией string.split(), которая содержит только один символ. –

+1

Будьте осторожны, потому что это не сработает для таких вещей, как «Привет, мистер и миссис Смит». – Yodacheese

+0

@Yodacheese: Да, это правда. Это потребовало бы гораздо более углубленного анализа смысла предложения, чтобы поймать, когда срок фактически заканчивается предложением. Рассмотрим, например, предложения «Почетный г-н Смит - фамилия». – Guffa

 Смежные вопросы

  • Нет связанных вопросов^_^