2010-03-21 100 views
3

我想匹配字符串,如AhKs & AdKs(即两张卡Ah = Heart of Ace)。我想用正则表达式匹配两个off-suit卡片,我现在拥有的是"^[AKQJT2-9][hscd]{2}$",但这可能匹配诸如AhKh(合适)和AhAh之类的手。有没有一种方法可能要使用反向引用说第二[hscd]不能一样正则表达式检查范围内的字符不重复

回答

4

试试这个正则表达式的冷杉(同样为[AKQJT2-9]):

^[AKQJT2-9]([hscd])[AKQJT2-9](?!\1)[hscd]$ 

这里,negative look-ahead assertion (?!…)用来禁止第四字符与第二个(第一个分组的匹配)相同。

但如果正则表达式实现不支持环视断言,您可能需要将其扩展成:

^[AKQJT2-9](h[AKQJT2-9][scd]|s[AKQJT2-9][hcd]|c[AKQJT2-9][hsd]|d[AKQJT2-9][hsc])$ 
+0

击败我6秒! :D – 2010-03-21 13:55:34

5

不完全优雅,但工作原理:

^[AKQJT2-9]([hscd])[AKQJT2-9](?!\1)[hscd]$ 
+0

+1这实际上非常优雅。我的版本将会更加丑陋。 :) – cletus 2010-03-21 13:57:20

+0

击败我1秒! )))) – user187291 2010-03-21 13:57:48

1

一负面望向来拯救

/^[AKQJT2-9]([hscd])[AKQJT2-9](?!\1)[hscd]$/ 

:(太迟了

1

是的。使用反向参考和负面预测。

^([AKQJT2-9])([hscd])(?!\1)(?!.\2)[AKQJT2-9][hscd]$