我有一个字符串形式为“ AsKcQsJd”,它代表一副扑克牌中的4张牌。大写字母代表卡值(在这种情况下为Ace,King,Queen和Jack),小写字母代表西服(在这种情况下为黑桃,棍棒,黑桃,钻石)。
说我还有另一个值,可以告诉我我要寻找什么西装。所以在这种情况下,我有:
$hand = 'AsKcQsJd';
$suit = 's';
我该如何编写正则表达式来检查手牌中是否有A,然后是花色,因此在这种情况下为“ As”以及任何其他具有花色的牌?还是用“扑克术语”来说,我试图确定这手牌是否具有定义为$ suit的西装的“ ace高抽奖”。
为进一步说明,我需要检查以下两张卡是否存在任何组合:
AsK,AsQ,AsJ,AsT,As9s,As8s,As7s,As6s,As5s,As4s,As3s,As2s
由于这些卡片可能会出现在手中的任何地方,因此更加复杂。例如,字符串可以在前面有As,在末尾有Ks。这就是为什么我认为正则表达式是确定两个字符串是否共存的最佳方法。
答案 0 :(得分:3)
您可以使用两次前行,一次用于As
,一次用于[^A]s
,
(?=.*As)(?=.*[^A]s)
$suit = 's';
$re = '/(?=.*A' . $suit . ')(?=.*[^A]' . $suit . ')/';
print($re); // /(?=.*As)(?=.*[^A]s)/
print(preg_match($re, 'AsKcQsJd')); // 1
print(preg_match($re, 'AdKcQsJd')); // 0
print(preg_match($re, 'KsKcQsJd')); // 0
答案 1 :(得分:2)
我不确定正则表达式是否是最好的解决方案,但是如果这是您的一杯茶,您可以像这样交替进行以轻松完成它:
rank2classes
或更妙的是-捕获实际的纸牌给您匹配:
As.*s|s.*As
这些基本上是说-手牌是黑桃,后面是黑桃,或者牌是黑桃,后面是其他黑桃。 https://regex101.com/r/pdwHPQ/1
也就是说,我可能会考虑建立一个简单的类来分析手牌,并在回答有关存在哪些牌的问题时为您提供更大的灵活性。是否值得真的取决于您的应用程序。这是一个主意:
(As).*(.s)|(.s).*(As)