Регулярное выражение с пустой группой "()", возвращающее странные результаты - PullRequest
4 голосов
/ 29 января 2010

Это немного выдвигает грань, но у меня есть следующая ситуация с этим регулярным выражением - "()": Когда используется для разбиения строки в массив string [], результаты мне несколько странны. Например, эта строка кода:

string[] res = new Regex("()").Split("hi!");

устанавливает res в массив из 9 (!) Элементов: ["", "", "h", "", "i", "", "!", "", ""]

Я ожидаю, что вместо этого будут возвращены эти 5 элементов: ["h", "", "i", "", "!" ]. Причина, по которой мне нужен этот конкретный результат, заключается в совместимости с другой библиотекой регулярных выражений ...

У меня такой вопрос, может ли это быть из-за некоторых отсутствующих опций объекта регулярного выражения или из-за проблемы кодирования или подобного ... Или оно определено каким-то образом и определенно правильно оно должно работать? Кроме того, есть ли способ заставить его вернуть второй (ожидаемый) результат вместо этого?

Ответы [ 2 ]

3 голосов
/ 29 января 2010

Я указал позиции, где ваше регулярное выражение будет совпадать, используя символ |: "|h|i|!|"

Split возвращает массив, элементы которого находятся либо между двумя соседними совпадениями, либо между началом строки и первым совпадением, либо между последним совпадением и концом строки. Он возвращает их в порядке их появления в строке. Это дает этот результат: ["","h","i","!",""]

Это объясняет 5 из 9 элементов массива.

Однако, «если в выражении Regex.Split используются захватывающие скобки, любой полученный текст включается в результирующий строковый массив». (прямая цитата из MSDN, здесь: http://msdn.microsoft.com/en-us/library/ze12yx1d.aspx)

В этом случае захваченный текст является пустой строкой. Поскольку у нас было 4 совпадения, это объясняет остальные 4 элемента в вашем результате.

Таким образом, полный результат: ["","","h","","i","","!","",""]

3 голосов
/ 29 января 2010

Я бы сказал, что девять элементов верны, потому что выражение также совпадает до "h" и после "!".

Чтобы избежать совпадения в начале или конце, вы можете добавить заглядывание вперед / назад, чтобы убедиться, что вокруг пустого совпадения больше символов: "(?<=.)()(?=.)"

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