Разделить строку на предложения с помощью регулярного выражения - PullRequest
5 голосов
/ 29 октября 2008

Мне нужно сопоставить строку типа «один. Два. Три. Четыре. Пять. Шесть. Семь. Восемь. Девять. Десять. Одиннадцать» в группы из четырех предложений. Мне нужно регулярное выражение, чтобы разбить строку на группу после каждого четвертого периода. Что-то вроде:

  string regex = @"(.*.\s){4}";

  System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(regex);

  string result = exp.Replace(toTest, ".\n");

не работает, потому что он заменит текст перед периодами, а не только сами периоды. Как я могу сосчитать только периоды и заменить их точкой и символом новой строки?

Ответы [ 6 ]

2 голосов
/ 29 октября 2008

. в регулярном выражении означает «любой символ»

поэтому в своем регулярном выражении вы использовали .*., которое будет соответствовать слову (это эквивалентно .+)

Возможно, вы искали [^.]\*[.] - последовательность символов, которые не являются ".", за которыми следует ".".

1 голос
/ 29 октября 2008

Попробуйте определить метод

private string AppendNewLineToMatch(Match match) {
    return match.Value + Environment.NewLine;
}

и использование

string result = exp.Replace(toTest, AppendNewLineToMatch);

Это должно вызывать метод для каждого совпадения и заменять его результатом этого метода. Результатом метода будет соответствующий текст и символ новой строки.


РЕДАКТИРОВАТЬ: Кроме того, я согласен с Оливером. Правильное определение регулярного выражения должно быть:

  string regex = @"([^.]*[.]\s*){4}";

Еще одно редактирование: исправлено регулярное выражение, надеюсь, на этот раз я понял правильно.

0 голосов
/ 29 октября 2008

Я не уверен, что ответ конфигуратора искажен редактором или как, но он не работает. Правильный шаблон

string regex = @"([^.]*[.]){4}\s*";
0 голосов
/ 29 октября 2008

В этом случае может показаться, что регулярное выражение немного излишне. Я бы порекомендовал использовать String.split, а затем разбить получившийся массив строк. Это должно быть намного проще и надежнее, чем пытаться заставить регулярное выражение делать то, что вы пытаетесь сделать.

Что-то вроде этого может быть немного проще для чтения и отладки.

String s = "one. two. three. four. five. six. seven. eight. nine. ten. eleven"
String[] splitString = s.split(".")
List li = new ArrayList(splitString.length/2)
for(int i=0;i<splitString.length;i+=4) {
    st = splitString[i]+"."
    st += splitString[i+1]+"."
    st += splitString[i+2]+"."
    st += splitString[i+3]+"."
    li.add(st)
}
0 голосов
/ 29 октября 2008

Вы вынуждены делать это с помощью регулярных выражений? Не проще ли разделить строку и обработать массив?

0 голосов
/ 29 октября 2008

Выражение поиска: @"(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)" Заменить выражение: "$1 $2 $3 $4.\n"

Я выполнил это выражение в RegexBuddy с выбранным регулярным выражением .NET, и вывод:

one two three four.
five six seven eight.
nine. ten. eleven

Я пробовал с типом @"(?:([^.]+?).\s){4}", но захват будет захватывать только последнее вхождение (т. Е. Слово), поэтому, когда дело доходит до замены, вы потеряете три слова из 4. Пожалуйста, кто-то поправит меня, если я я неправ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...