Я хочу найти 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, если в шаблоне есть группы захвата.
На странице MSDN для этой функции указано:
Если фиксирующие скобки используются в выражении Regex.Split, любой полученный текст включается в результирующий массив строк. Например, если вы разделите строку "plum-pear" на дефис, помещенный в скобки скобок, возвращаемый массив включает строковый элемент, содержащий дефис.
поэтому вы хотите удалить эту группу захвата, добавив ?:
to it:
Regex.Split("abcd", "b(?:c)")
Если вы не хотите изменять выражение, но удалить захват, вы должны использовать другую функцию:
ExplicitCapture
См. Страницу параметровСогласно документации
Если фиксирующие скобки используются в выражении Regex.Split, любой полученный текст включается в результирующий массив строк. Например, если вы разделите строку "plum-pear" на дефис, помещенный в скобки скобок, возвращаемый массив включает строковый элемент, содержащий дефис.
Ваше определение совпадения как b (c) вызывает захват c как группу и, следовательно, он включается в результат. Вместо этого вам нужно сопоставить "bc", который будет соответствовать только тогда, когда появится bc.
Это правильное поведение в соответствии с 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, любой полученный текст включается в результирующий массив строк.