2010-04-13 23 views
5

Ist es möglich, einen regulären Ausdruck im PCRE-Stil zu erstellen, der nur jeden Buchstaben in einer Liste nur einmal abgleicht?Regex, um jeden Buchstaben nur einmal zu verwenden?

Zum Beispiel, wenn Sie die Buchstaben „LRSA“ haben und Sie versuchen, eine Wortliste passend gegen:

^[lrsa]*m[lrsa]*$ 

du gehst „vermöbelt“ (gültig) entsprechen, sondern auch „Lama“ (ungültig für unsere Zwecke, weil Sie nur ein "a" hatten). Wenn dein Briefset "lrsaa" wäre, würdest du "lamas" anpassen wollen.

Ist dies mit regulären Ausdrücken möglich, oder sollte ich es programmgesteuert behandeln?

+0

Dies wird als 'nicht funktioniert [lrsaa] 'gleich' [LRSA] '. – Gumbo

+1

Richtig, und das ist mein Problem. Sie können mit [lrsa] {4} begrenzen, aber das entspricht zum Beispiel immer noch "lass". – gtcaz

+0

Was Sie tun können, ist die Übereinstimmung mit den gewünschten und einige Extras, die Sie nicht tun. Bei einer Iteration Ihrer Matches wäre es trivial, die unerwünschten Extras herauszufiltern. – erisco

Antwort

3

Sie negativ Vorgriffs verwenden:

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

wird tun, was Sie wollen

+1

Ja, das funktioniert, wo jeder Buchstabe einzigartig ist. Sehr hilfreich. (Ich muss das durchsehen und herausfinden, wie es funktioniert. Lesen Sie auch das: http://StackOverflow.com/questions/1749437/regular-expression-negative-lookahead) Was ist, wenn es mehr als ein Vorkommen von gibt ein Brief, zB: "abbcde" und du willst auf "babe" aber nicht auf "dade" passen? Möglich? – gtcaz

+0

Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber vielleicht wird das den Trick machen: '^ (?!. *? (D). *? \ 1) \ w + $' – ZyX

Verwandte Themen