2010-04-13 49 views
5

是否可以构造一个只能匹配列表中每个字母一次的PCRE样式正则表达式?正则表达式只能使用每个字母一次?

例如,如果你有字母“lrsa”,并尝试对匹配的单词列表:

^[lrsa]*m[lrsa]*$ 

你要匹配“拉姆塞”(有效),也有“喇嘛”(对我们的目的无效,因为你只有一个“a”)。如果你的信件集是“lrsaa”,你会想要匹配“喇嘛”。

这是可能的正则表达式,或者我应该以编程方式处理它?

+0

这究竟会不会为'[lrsaa]工作'等于'[lrsa]'。 – Gumbo 2010-04-13 16:53:24

+1

对,这是我的问题。例如,您可以限制[lrsa] {4},但仍然会匹配“lass”。 – gtcaz 2010-04-13 16:55:20

+0

你可以做的是匹配你想要的和你不需要的一些额外的东西。通过迭代你的匹配,过滤掉不需要的额外信息将是微不足道的。 – erisco 2010-04-13 17:00:48

回答

3

可以使用负前瞻:

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

会做你想要

+1

是的,每个字母都是独一无二的。很有帮助。 (我需要对它进行排序并且说明它是如何工作的。阅读这个以及:http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead) 那里有多个发生一封信,例如:“abbcde”,你想匹配“宝贝”而不是“dade”?可能? – gtcaz 2010-04-13 17:49:12

+0

我不确定我是否正确地理解了你,但也许这会做诀窍:'^(?!。*?(d)。*?\ 1)\ w + $' – ZyX 2010-04-14 02:45:11

相关问题