2010-03-21 77 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]$ 
相關問題