Использование именованных групп захвата вызывает другое совпадение - PullRequest
0 голосов
/ 24 января 2019

Дано регулярное выражение: ^(Start\.)?(.+?)(\.|\.\2)?(End)?$

Тестовый ввод: Start.Word.WordEnd

Я получаю Word для группы "2":

enter image description here

Однако, если я изменю регулярное выражение, добавив также имя для захваченной группы, я получу другой результат:

Регулярное выражение: ^(Start\.)?(?<capturedGroup>.+?)(\.|\.\2)?(End)?$

захваченная группа Word.Word

enter image description here

Это в .NET 4.7.2 (я также провел тест в https://dotnetfiddle.net/ с тем же результатом). Ссылки:

первый случай: https://dotnetfiddle.net/o33G6Y

второй случай: https://dotnetfiddle.net/4zJuaQ

Я проверил это в https://regex101.com/ (установлен как PHP), и я получил ожидаемый результат (оба Word), поэтому я ожидаю, что это проблема .NET? Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

См. .NET Grouping Constructs regex docs :

Именованные совпавшие подвыражения нумеруются последовательно слева направо после сопоставленных подвыражений.

Итак, ваши группы шаблонов анализируются в следующем порядке:

^(Start\.)?(?<capturedGroup>.+?)(\.|\.\2)?(End)?$
 ^---1---^ ^-------- 4 --------^^---2---^ ^-3-^

При отладке вы можете проверить реальные числовые идентификаторы группы:

enter image description here

Вам просто нужно либо использовать обратную ссылку на именованную группу, \k<capturedGroup>, либо использовать \4 вместо \2 (что не так интуитивно понятно, поэтому я бы предпочел использовать предыдущее решение).

  • ^(Start\.)?(?<capturedGroup>.+?)(\.|\.\k<capturedGroup>)?(End)?$ - Демо 1
  • ^(Start\.)?(?<capturedGroup>.+?)(\.|\.\4)?(End)?$ - Демо 2

Выход:

enter image description here

0 голосов
/ 24 января 2019

Я думаю, что проблема вызвана тем фактом, что \ 2 соответствует содержимому из второго набора скобок в выражении, которое было изменено, и теперь не может соответствовать ему.

Возможно, потому что он назван, и у вас будет одинаковое имя в двух группах.

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