2010-04-13 13 views
5

Czy można skonstruować wyrażenie regularne w stylu PCRE, które będzie pasować tylko do każdej litery na liście tylko raz?Regex, aby użyć każdej litery tylko raz?

Na przykład, jeśli masz litery „lrsa” i próby dopasowania listę słowo przeciw:

^[lrsa]*m[lrsa]*$ 

zamierzasz dopasować „Lams” (ważne), ale również „lamów” (nieważne dla naszych celów, ponieważ miałeś tylko jedno "a"). Jeśli twoim zestawem liter był "lrsaa", chciałbyś dopasować "lamów".

Czy jest to możliwe w przypadku wyrażeń regularnych, czy też powinienem go programować programowo?

+0

to nie będzie działać jako '[lrsaa]' jest równe '[lrsa]'. – Gumbo

+1

Dobrze, i to jest mój problem. Możesz ograniczyć za pomocą [lrsa] {4}, ale na przykład nadal będzie pasować do "lass". – gtcaz

+0

Co możesz zrobić, to dopasować zarówno te, które chcesz i niektóre dodatki nie. Przy iteracji twoich meczów odfiltrowanie niechcianych statystów byłoby trywialne. – erisco

Odpowiedz

3

Można użyć negatywny look-ahead:

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

zrobi co chcesz

+1

Tak, to działa tam, gdzie każda litera jest unikatowa. Bardzo pomocne. (Muszę to przejrzeć i dowiedzieć się, jak to działa. Czytanie tego również: http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead) Co tam, gdzie jest więcej niż jedno wystąpienie list, np. "abbcde" i chcesz dopasować na "babe", ale nie "dade"? Możliwy? – gtcaz

+0

Nie jestem pewien, czy zrozumiałem cię poprawnie, ale może to wystarczy: '^ (?!. *? (D). *? \ 1) \ w + $' – ZyX

Powiązane problemy