Захват подстроки совпадающей группы

Сканарио

Мне нужно взять подстроку из составленной строки. Условия совпадения:

  • строка начинается с 'section1:'

  • захваченная строка может быть разделена пробелом или разделенным тире списком буквенно-цифровых значений

  • если захваченная строка заканчивается определенным суффиксом ('-xx'), исключите этот суффикс из захваченной строки.

Примеры

section1:ypsilon : соответствует разделу 1, захватите 'ypsilon'

section1:ypsilon zeta : соответствует разделу 1, захватите 'ypsilon zeta'

section1:ypsilon-zeta : совпадает с разделом 1, возьмите 'ypsilon-zeta'

section1:ypsilon-xx : совпадает с разделом 1, взять "ypsilon", исключить "-xx"

section1:ypsilon zeta-xx : совпадает с разделом 1, взять "ypsilon zeta", исключить "-xx"

section1:ypsilon-zeta-xx : совпадает с разделом 1, взять "ypsilon-zeta", исключить "-xx"

section2:ypsilon : раздел 2 не соответствует

Решение на данный момент

^section1:([a-zA-Z0-9\- ]+)(\-xx)?$

Идея состоит в том, чтобы получить группу 1, тогда как группа 2 не является обязательной. Демо.

Вопрос

К сожалению, суффикс соответствует определению group1, так как это буквенная строка с дефисом. Таким образом, полученные захваченные строки не исключают суффикс.

Любая подсказка?


person Alberto De Caro    schedule 06.05.2015    source источник


Ответы (2)


Вы были рядом, главная проблема, с которой вы столкнулись, это жадность операторов.

n+ будет соответствовать как можно большему количеству n, если мы хотим уменьшить это, мы должны добавить к нему суффикс ?

Я получаю это регулярное выражение Демо здесь

^section1:([a-zA-Z0-9\- ]+?)(|-xx)$

Основное отличие состоит в том, что ? после + делает его нежадным (или неохотным), и я предпочитаю использовать чередование между пустым суффиксом и суффиксом желания вместо группы (|-xx) это ничего не соответствует ИЛИ -xx перед концом строки.

Я не спорю между обоими, думаю, дело вкуса.

person Tensibai    schedule 06.05.2015

Используйте изменение -xx с группой без захвата и используйте ?, чтобы сделать + не настолько готовым, чтобы -xx всасывался в совпадение:

(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|:)

Демо

Если у вас нет второй : для использования в качестве закладки, используйте $:

(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|\s*$)

Демонстрация 2

person dawg    schedule 06.05.2015
comment
Стоит сказать пару слов о нежадном операторе, нет? - person Tensibai; 06.05.2015