正则表达式:检查字符串是否匹配多个子字符串,且顺序随意。

3

我有一个字符串,其格式始终如下:

"AB AB AB AB AB "   // (note the trailing space)

A可以是"12345678TJQKA"中的任何字符,B可以是"HSCD"中的任何字符(基本上是52张扑克牌)。

如何使用正则表达式检查字符串是否为皇家同花顺?

我尝试了一些无果的方法(现在仅使用红方),(注意:我不知道如何正确地使用向前查看、向后查看和环视,所以我很可能做错某些事情每件事..)

^(?=AD )(?=KD )(?=QD )(?=JD )TD $
^(?=AD .*)(?=KD .*)(?=QD .*)(?=JD .*)TD .*$
^(?=AD )(?=KD )(?=QD )(?=JD )(?=TD )$
^(?=AD .*)(?=KD .*)(?=QD .*)(?=JD .*)(?=TD .*)$
^(?<=AD )(?<=KD )(?<=QD )(?<=JD )(?<=TD )$

我希望正则表达式可以匹配任意顺序的 "AD KD QD JD TD " (包括反向顺序如"TD JD QD KD AD " 或者随机顺序如 "KD TD QD AD JD ")。最好还能为所有四种花色中的 D 设置一个捕获组,使其在所有情况下都保持一致。 这是一个在线正则表达式测试工具,里面有一些测试用例,供大家参考。 如果你有一个不仅适用于钻石皇家同花顺,而且同时适用于所有花色的正则表达式(并解释其工作原理),那就更好了。(除了正则表达式外,任何其他检查皇家同花顺的方法都可以,但我仍然想知道如何使用正则表达式来实现,因为这是我的主要问题。)

1
我认为你要么得使用非常丑陋的替换,要么就需要多次使用环视。无论如何,我不确定纯正则表达式解决方案是否最适合你的问题,因为一个给定玩家的手牌可以是任意顺序。找到顺子或同花顺的更好方法可能是按等级对手牌进行排序,然后使用字符串函数进行检查(可能涉及一些正则表达式)。 - Tim Biegeleisen
我不确定,但您是指这个吗?https://ideone.com/QQNcj6 - Youcef LAIDANI
@YCF_L 不完全是这样,因为它还会返回成功的结果,例如 "TC JD QD KD AD""1D JD QD KD AD",但它们并不是皇家同花顺。 :) - Kevin Cruijssen
1个回答

2
你可以使用正则表达式来检查,但这可能不是最好的方法。我的回答假设所有字符串都是正确的条目(以给定格式为例有5张卡)。然后我们可以使用:
^(?=.*J(\w))(?=.*Q\1)(?=.*T\1)(?=.*K\1)(?=.*A\1).*$

要检查是否为皇家同花顺,我们使用一系列正向预查来检查所需的牌,并在第一次尝试中匹配使用的花色并用反向引用重复使用。我们可以简单地使用\w来检查花色,因为卡牌类型和花色的标识符不重叠(甚至.也应该可以)。请参见https://regex101.com/r/eR9kQ6/23

为什么在 Q 前面要使用 .+ 而不是 .*?这是有原因的,还是打错了? - Kevin Cruijssen
@KevinCruijssen 打字错误 - Sebastian Proske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接