2016-10-09 2 views
0

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

^(UCX_|UBX_|USP_)([A-Za-z0-9]\w+)(_\d+)?$ 

Когда я проверяю строку:

UCX_1maxi_holiday2_blah_343 

Это правильно тестирует верно, однако мой последний захват группы будет никогда не будет достигнуто, потому что оно соответствует второй группе. т. Е. Если последний раздел демаркированного подчеркивания - это все числа, я хочу, чтобы этот раздел в третьей группе захвата не был вторым. Иначе я хочу это во второй группе.

Я думал о взглядах и -бегах, и я не думаю, что они будут работать для этого, но я мог бы быть удивлен.

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

мне интересно, если есть способ, чтобы изменить вторую группу захвата, чтобы остановить его от затирания конца, если это весь номер

Любых получил несколько Regex JiuJitsu для этого?

ответ

1

Если вы измените второй захват на неживую, вы получите то, что хотите. Использование:

^(UCX_|UBX_|USP_)([A-Za-z0-9]\w+?)(_\d+)?$ 
+0

Это работает. Мое первоначальное понимание неподдельности требует некоторого образования. Таким образом, не жадный будет передавать на еду, если он знает, что следующий образец возьмет его? – jollarvia

+0

Как правило, да. Жадные выражения обычно бывают быстрее, так как не-жадные совпадения должны смотреть вперед или назад (чтобы «знать», что нужно оставить для следующей части шаблона); во многих случаях разница в скорости никогда не имеет значения. – cco

0

Вы можете упростить это делать:

^(UCX_|UBX_|USP_)(\w+?)(_\d+)?$ 

\w символ является символом из-Z, A-Z, 0-9, в том числе _ (подчеркивание).

+0

Спасибо Marcel, но это потребует группы чисел в конце, и я пытаюсь сделать это необязательным – jollarvia

+0

Я получил его, @jollarvia. Я обновил ответ. –

+0

Другая вариация регулярного выражения: ['^ (U (?: [BC] X | SP) _) ((?! _) \ W +?) (_ \ D +)? $'] (Https://regex101.com/ r/EdF7X2/1) –

Смежные вопросы