2010-04-13 3 views
5

Возможно ли создать регулярное выражение в стиле PCRE, которое будет соответствовать только каждой букве в списке только один раз?Regex использовать каждую букву только один раз?

Например, если у вас есть буквы «lrsa», и вы пытаетесь сопрягать список слов против:

^[lrsa]*m[lrsa]*$ 

вы собираетесь соответствовать «Lams» (действует), но и «лам» (недействителен для наших целей, потому что у вас только один «а»). Если ваше письмо было «lrsaa», вам нужно было бы совместить «lamas».

Возможно ли это с помощью регулярных выражений, или я должен обращаться с программным обеспечением?

+0

Это не будет работать как '[lrsaa]' равно '[lrsa]'. – Gumbo

+1

Правильно, и это моя проблема. Вы можете ограничить с помощью [lrsa] {4}, но это все равно будет соответствовать «lass», например. – gtcaz

+0

Что вы можете сделать, так это соответствовать тем, которые вы хотите, и некоторым дополнительным функциям, которых вы не делаете. С итерацией ваших матчей было бы тривиально отфильтровывать нежелательные дополнения. – erisco

ответ

3

Вы можете использовать отрицательный смотреть вперед:

^(?!.*?(.).*?\1)[lrsa]*m[lrsa]*$ 

будет делать то, что вы хотите

+1

Да, это работает, где каждая буква уникальна. Очень полезно. (Мне нужно разобраться в этом и понять, как это работает. Также читайте это: http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead) О том, где есть более одного события письмо, например: «abbcde», и вы хотите соответствовать «babe», но не «dade»? Возможное? – gtcaz

+0

Я не уверен, что правильно вас понял, но, возможно, это будет трюк: '^ (?!. *? (D). *? \ 1) \ w + $' – ZyX

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