2013-02-17 3 views
2

Я пытаюсь решить проблему с регулярными выражениями. Я использую Java regex, похожее на Perl.Регулярное выражение: последовательные повторения с буквой между

Я хочу найти строку, которая имеет одну цифру от 1 до 9, повторяя 3 или более раз подряд или с единственной буквой «w» между повторениями.

Для примера. 12333, 123w3, 12ww3, ww123 должны давать успешные матчи, но не 12345, 1234w, 1323w.

Я пробовал шаблон «[[0-9] w] {3,}», но теперь я понимаю, почему это определенно неверно. Может ли кто-нибудь дать мне несколько подсказок для построения шаблона поиска, который соответствует моим требованиям?

+0

Как '123w3',' 12ww3' и 'ww123' соответствуют вашим требованиям? В первом случае всего 2 3, во втором случае нет повторных цифр, а в третьем случае 'w' не находится между любыми числами. –

+0

Мне это трудно понять. И почему не '1323w' действительно (имеет 33w)? Является ли '12ww3' таким же, как' 12223', или как '12333'? Как насчет '123ww'? – Kobi

+1

Просьба уточнить критерии для матча. – MikeM

ответ

4

Если я правильно понимаю, что w является подстановочные (потому что я не уверен, от того, что вы написали - больше на примерах, которые вы даете), то это регулярное выражение должно работать ...

([1-9])(\1|w){2,}|w([1-9])(\3|w)+|ww([1-9])\5* 

Это может быть не самое элегантное решение, но он должен работать, и перерывы в части, как это ...

  # matches that don't start with wildcards 
([1-9]) # get a digit, and capture for future reference 
(\1|w){2,} # the captured digit, or the letter w, 2 or more times 
|   # or, matches that start with a single w 
w   # match a w 
([1-9]) # get a digit, and capture for future reference 
(\3|w)+ # get one or more of the captured digit, or letter w 
|   # or, matches starting with two w 
ww   # get two w 
([1-9]) # get a digit, and capture for future reference 
\5*  # get all the successive captured digits 

Это также должно работать ...

([1-9])(\1|w){2,}|w([0-9](\3|w)|w[0-9]) 
+1

Цифры немного не нужны, вам нужно что-то вроде '([0-9]) (?: \ 1 | w) {2} | w ([0-9]) (?: \ 2 | w) | ww ([0-9]) '. Обратите внимание, что '\ 1' всегда является первой группой -' ([0-9]) '- и пуст, когда первое чередование не совпадает. – Kobi

+0

@kobi Спасибо, я отредактировал, надеюсь, исправить сейчас –

+0

@BillyMoon Yup, это именно то, что я искал. Я также хотел бы оценить, что вы нашли время, чтобы разделить решение на части. Это было важно для меня, поскольку я только начинаю изучать регулярные выражения. Благодаря тонну! – balajeerc

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