Как получить правильные результаты от Regex.Split с группами

1

Я хочу найти a) все части входной строки, которые соответствуют шаблону; и b) все части входной строки, которые не соответствуют одному и тому же шаблону. Я использую Regex.Matches, чтобы найти части, которые соответствуют, и я пытаюсь использовать Regex.Split для удаления частей, которые соответствуют и оставляют меня с части, которые не совпадают. Шаблон определяется пользователем, поэтому изменение групп захвата в группы, не участвующие в захвате, неприемлемо.

Итак, я думал, что Regex.Split должен был удалить соответствующий текст и вернуть массив всех остальных частей строки. Например, строка ввода "abcd" с шаблоном "bc" вернет массив строк с двумя элементами "a" и "d".

Но когда вы добавляете группы в шаблон, результаты становятся все поддельными. Если вы запустите это:

Regex.Split("abcd", "b(c)")

Результаты:

a
c
d

Почему "c" появляется в результатах раскола? Это часть шаблона, который я хочу разделить. Я использую один и тот же шаблон для получения совпадений и разбиения строки, поэтому изменение группы в группе, не являющейся захваченной, неприемлемо. Есть ли способ фактически разбить строку с шаблоном регулярного выражения (Regex.Split явно сломан)?

======

Ответ. Невозможно получить части строки между совпадениями шаблонов, используя Regex.Split, если в шаблоне есть группы захвата.

Теги:

3 ответа

1

На странице MSDN для этой функции указано:

Если фиксирующие скобки используются в выражении Regex.Split, любой полученный текст включается в результирующий массив строк. Например, если вы разделите строку "plum-pear" на дефис, помещенный в скобки скобок, возвращаемый массив включает строковый элемент, содержащий дефис.

поэтому вы хотите удалить эту группу захвата, добавив ?: to it:

Regex.Split("abcd", "b(?:c)")

Если вы не хотите изменять выражение, но удалить захват, вы должны использовать другую функцию:

  • 0
    Нет, я не хочу удалять группу захвата. Я использую Regex.Matches и Regex.Split, и я хочу использовать один и тот же шаблон для обоих.
  • 1
    Ну, тогда вы не используете хорошую функцию, смотрите редактирование.
Показать ещё 1 комментарий
1

Согласно документации

Если фиксирующие скобки используются в выражении Regex.Split, любой полученный текст включается в результирующий массив строк. Например, если вы разделите строку "plum-pear" на дефис, помещенный в скобки скобок, возвращаемый массив включает строковый элемент, содержащий дефис.

Ваше определение совпадения как b (c) вызывает захват c как группу и, следовательно, он включается в результат. Вместо этого вам нужно сопоставить "bc", который будет соответствовать только тогда, когда появится bc.

1

Это правильное поведение в соответствии с http://msdn.microsoft.com/en-us/library/ze12yx1d%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet- 4

Прямо над этим фрагментом:

Если фиксирующие скобки используются в выражении Regex.Split, любой полученный текст включается в результирующий массив строк.

  • 1
    Я понимаю, что это сделано по замыслу, но, насколько я понимаю, оно сломано по замыслу.
  • 1
    @ Ник Нет, он не сломан, потому что это поведение по умолчанию, но не единственное. Дизайн позволяет вам выбрать, хотите ли вы такое поведение или нет.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню