首页 > 解决方案 > 用于确定字符串特定特征的正则表达式(即扑克手)

问题描述

我有一个“AsKcQsJd”形式的字符串,它代表一副扑克牌中的 4 张牌。大写的值代表卡片的价值(在这种情况下,Ace、King、Queen 和 Jack),小写的值代表花色(在这种情况下,黑桃、梅花、黑桃、菱形)。

假设我有另一个值,它告诉我我正在寻找什么西装。所以在这种情况下,我有:

$hand = 'AsKcQsJd'; $suit = 's';

我如何编写一个正则表达式来检查手牌中是否有 A,然后是花色,所以在这种情况下是“As”以及任何其他有花色的牌?或者在“扑克术语”中,我试图确定这手牌是否具有定义为 $suit 的花色的“A 高同花听牌”。

为了进一步解释,我需要检查是否存在以下两张卡的任何组合:

AsKs、AsQs、AsJs、AsTs、As9s、As8s、As7s、As6s、As5s、As4s、As3s、As2s

这些牌可能出现在手牌的任何地方,这增加了复杂性。例如,字符串可以在前面有 As,在结尾有 Ks。这就是为什么我认为正则表达式是确定两者是否在字符串中共存的最佳方法。

标签: phpregex

解决方案


您可以使用两种前瞻,一种用于As,一种用于[^A]s,如下所示:

(?=.*As)(?=.*[^A]s)

https://regex101.com/r/8hkWTv/1

$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

推荐阅读