php - 用于确定字符串特定特征的正则表达式(即扑克手)
问题描述
我有一个“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。这就是为什么我认为正则表达式是确定两者是否在字符串中共存的最佳方法。
解决方案
您可以使用两种前瞻,一种用于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
推荐阅读
- java - 将 Focusable 设置为 false 后 EditText 无法重新获得焦点
- powershell - 如何使用 PSADT 作为当前用户删除网络共享打印机
- python - 如何删除具有不同格式的数据框中的重复项?
- typescript - 从类型生成数组而不进行推断
- sql - 如何解决存储过程中发生的执行超时过期问题
- python - 在方法之间传递值,Python OOP,方法没有得到
- c - 是否有向头文件添加过多数据的解决方法?
- python - 将列映射到 dict 中的键
- reactjs - AADSTS65001:尝试通过 MSAL PublicClientApplication 授权用户时授权无效
- c++ - 通过指针的成员函数