Как определить это регулярное выражение с чередованием, чтобы иметь одинаковое количество групп в матче?
Я пытаюсь разобрать такие строки
99_GOG_A_X1_FOO X-2014-09
99_YAK_A_YZ1_BAR YZY-2014-10
с этим регулярным выражением
99_\w{3}_(A|B)_((X)(0*[1-9][0-9]?)_(FOO|BAR) X-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([1-9]|1[0-2])\b|(YZ)(0*[1-9][0-9]?)_(FOO|BAR) YZY-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([4]|1[0])\b)
Первый вход может иметь только от 1 до 12 в конце, в то время как второй вход может иметь только 04 или 10. Это работает. но я хотел бы иметь решение, которое возвращает только соответствующие группы.
С этим решением у меня есть эти группы http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDwsSBlJlY2lwZRiwuuALDA/index.html
У меня есть лишние группы, и совпадающие группы не имеют одинаковых индексов для обоих входов.
Есть ли способ избавиться от пустых групп и выровнять индексы?
Обновление: я должен соблюдать следующие правила. Если вход соответствует этому _((X)(0*[1-9][0-9]?)
он также должен содержать X-
и позвольте этому диапазону в конце \b0*([4]|1[0])\b
Если вход соответствует этому _(YZ)(0*[1-9][0-9]?)
он также должен содержать YZY-
и разрешить только эти входы в конце \b0*([4]|1[0])\b
Итак, я хочу объединить эти регулярные выражения:
^99_\w{3}_(A|B)_(X)(0*[1-9][0-9]?)_(FOO|BAR) X-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([1-9]|1[0-2])\b$
^99_\w{3}_(A|B)_(YZ)(0*[1-9][0-9]?)_(FOO|BAR) YZY-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([4]|1[0])\b$
1 ответ
Из того, что я понимаю, это может работать для вас:
99_\w{3}_(A|B)_((X|(?>YZ))(0*[1-9][0-9]?)_(FOO|BAR) \3Y?-(\b0?20(1[4-9]|[2-9][0-9])\b)-\b0?((?:[1-9]|1[0-2])|(?:[4]|1[0]))\b$)
Если это не удастся (что может случиться), вы должны рассмотреть возможность использования реального кода, чтобы убедиться, что он проходит " ((X)(0*[1-9][0-9]?)
он также должен содержать X-
и позвольте этому диапазону в конце \b0*([4]|1[0])\b
"
Используйте группы захвата, чтобы проверить, \3 == 'X'
или если \3 == 'YZ'
а затем применить остальное регулярное выражение при необходимости