Странное поведение группы захвата регулярных выражений возвращается или передает результат

Я пытаюсь создать группу захвата для поиска/замены суффиксов.

Пожалуйста, посмотрите пример здесь:

https://www.myregextester.com/?r=b23e74dc

и мое резюме ниже:

Регулярное выражение:

(\b(.*?)(logical|logic))

Запрошенный вывод:

  • 0=\0
  • 1=\1
  • 2=\2

однако выходные данные групп захвата, которые я тестирую, возвращают «|» в результате кажется некоторая избыточность

Вывод:

  • 0 = Метеорологический
  • 1 = Метеорологический
  • 2=Метеоро0=|Метеорологический
  • 1=|Метеорологический
  • 2=|Метеор

Ясно, что я внес некоторую ошибку в регулярное выражение, так как мне НЕ нужен "|" на выходе, но я не понимаю, что это может быть.


person user3649739    schedule 12.02.2016    source источник
comment
Другого решения нет, если вам нужна 0-я группа. Я могу предложить повторно использовать \1, поскольку он расположен вокруг всего шаблона, но также использовать |: (([^|]*)(logic(?:al)?))\|?< /a> и замените на \n0=\1\n1=\1\n2=\2\n (символы новой строки можно изменить в соответствии с вашими потребностями).   -  person Wiktor Stribiżew    schedule 13.02.2016


Ответы (2)


Вы должны выложить его так, чтобы вы могли его видеть.

Meteorologic|Meteorological


0=Meteorologic
1=Meteorologic
2=Meteoro
0=|Meteorological
1=|Meteorological
2=|Meteoro

Первый матч заканчивается Meteorologic|Метеорологический

Начинается второй матч Meteorologic|Meteorological

Между c и | находится граница слова, поэтому \b выполняется.

Тогда .*? (группа захвата 2) соответствует |Meteoro до логического.

Затем logical в группе захвата 3.

Итак, он делает то, что вы просили.


Исправление

Чтобы сместить границу слова и найти слово вправо, просто введите
предварительный просмотр, подобный этому (\b(?=\w)(.*?)(logical|logic))


Примечание о границах слов: они двусмысленны.

Эквивалентно

 (?:
      (?:
           ^ 
        |  (?<= [^a-zA-Z0-9_] )
      )
      (?= [a-zA-Z0-9_] )
   |  
      (?<= [a-zA-Z0-9_] )
      (?:
           $ 
        |  (?= [^a-zA-Z0-9_] )
      )
 )

Надеюсь это поможет.

person Community    schedule 12.02.2016

Вы можете использовать отрицательный шаблон [^|]* для соответствия чему угодно, кроме канала:

(\b([^|]*)(logic(?:al)?))

В качестве альтернативы вы также можете использовать \w:

(\b(\w*)(logic(?:al)?))

Демо RegEx

person anubhava    schedule 12.02.2016
comment
Спасибо, но я думал, что вся цель канала в том, что он НЕ сопоставляется и не используется в качестве разделителя или в соответствии с regular-expressions.info/alternation.html - person user3649739; 12.02.2016
comment
Да, это правда, что трубка в (logical|logic) действительно действует как чередование. То, что вы видите в захваченной группе, - это канал, который появляется из-за того, что вы используете .*?, который захватывает все на входе до logic или логического, а ваш ввод имеет буквальный символ канала. - person anubhava; 12.02.2016