是否可以构造一个只能匹配列表中每个字母一次的PCRE样式正则表达式?正则表达式只能使用每个字母一次?
例如,如果你有字母“lrsa”,并尝试对匹配的单词列表:
^[lrsa]*m[lrsa]*$
你要匹配“拉姆塞”(有效),也有“喇嘛”(对我们的目的无效,因为你只有一个“a”)。如果你的信件集是“lrsaa”,你会想要匹配“喇嘛”。
这是可能的正则表达式,或者我应该以编程方式处理它?
是否可以构造一个只能匹配列表中每个字母一次的PCRE样式正则表达式?正则表达式只能使用每个字母一次?
例如,如果你有字母“lrsa”,并尝试对匹配的单词列表:
^[lrsa]*m[lrsa]*$
你要匹配“拉姆塞”(有效),也有“喇嘛”(对我们的目的无效,因为你只有一个“a”)。如果你的信件集是“lrsaa”,你会想要匹配“喇嘛”。
这是可能的正则表达式,或者我应该以编程方式处理它?
可以使用负前瞻:
^(?!.*?(.).*?\1)[lrsa]*m[lrsa]*$
会做你想要
这究竟会不会为'[lrsaa]工作'等于'[lrsa]'。 – Gumbo 2010-04-13 16:53:24
对,这是我的问题。例如,您可以限制[lrsa] {4},但仍然会匹配“lass”。 – gtcaz 2010-04-13 16:55:20
你可以做的是匹配你想要的和你不需要的一些额外的东西。通过迭代你的匹配,过滤掉不需要的额外信息将是微不足道的。 – erisco 2010-04-13 17:00:48