Регулярка для выделения "правильных" предложений

Energizer

Client
Регистрация
19.06.2013
Сообщения
36
Благодарностей
4
Баллы
8
Прошу помочь. Всю голову сломал.

Требуется регуляное выражение для выдергивания правильных предложений из текста. Т.е. предложение должно начинаться с большой буквы, заканчиваться знаком пунктации [.!?]. Сейчас такая регулярка у меня:

[A-Z0-9].*?[.!?]{1,3}\s

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

Всем спасибо за помощь!
 

Dailes

Client
Регистрация
27.05.2013
Сообщения
193
Благодарностей
76
Баллы
28
\S Не пустое место (не пробел, не \f, не \n, не \r, не \t, не \v)
в википедии, не? Концовку \S[.!?]
 

Energizer

Client
Регистрация
19.06.2013
Сообщения
36
Благодарностей
4
Баллы
8
Я это пробовал. Никак не влияет, все равно захватывает предложения с пробелом перед "точкой". Хз, это как-то с жадностью оператов связано или как оно там называется.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 714
Баллы
113
Так не получится. Регулярки работают по тексту вперед. Если вы исключите для себя концовки предложений с пробелом перед знаком, у вас будут в найденном совмещенные предложения.
Проще парсить этой регуляркой все, а потом еще дополнительно каждое предложение уже проверять.
 

Energizer

Client
Регистрация
19.06.2013
Сообщения
36
Благодарностей
4
Баллы
8
Ясно. Сейчас подумаю, выложу свое решение сюда. Может пригодится кому.
 

Energizer

Client
Регистрация
19.06.2013
Сообщения
36
Благодарностей
4
Баллы
8
Еще вопрос по эффективности использования регваров в C#-сниппетах. У меня такой код:
Код:
......
var reg = new Regex(pattern1);
text = reg.Replace(text, "");
MatchCollection matches = Regex.Matches(text, pattern2);
string text1 = "";
foreach (Match match in matches)
{
   text1 = String.Concat(text1,  " ", match.Groups[1].Value);
}
reg  = new Regex(pattern3);
text1 = reg.Replace(text1, "");
//Оставляем только правильные предложения
.....
Не создаются ли здесь лишние экземпляры классов и т.п.? Ибо в многопотоке это будет жрать ресурсы. Шаблон будет требовательный и так. И вообще 5-6 вызовов методов класса Regex насколько критичны для ресурсоемкости?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)