正则表达式:检查字符串是否以随机顺序匹配多个子字符串

Regex: check if string match multiple substrings in random order

我有一个始终采用以下模式的字符串:

"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 的捕获组,这样所有四套西装都是统一的..

Here is an online regex tester with some test cases in case anyone want to fuddle around.

如果您有一个正则表达式,不仅可以匹配钻石同花大顺,而且可以同时匹配所有花色(并解释其工作原理),那就更好了。 (任何其他检查皇家同花顺而不是正则表达式的方法也很好,但我仍然想知道如何在正则表达式中也能做到这一点,因为这是我的主要问题所在。)

您可以使用正则表达式来检查这一点,尽管这可能不是最好的方法。

我的回答假设所有字符串都是正确的条目(给定格式的 5 张卡片)。

然后我们可以使用

^(?=.*J(\w))(?=.*Q)(?=.*T)(?=.*K)(?=.*A).*$

检查是否是皇家同花顺。我们使用一堆前瞻来检查所需的卡片,并在第一次尝试匹配使用过的花色并将其与反向引用一起使用。我们可以简单地使用 \w 来检查花色,因为卡类型和花色的标识符不重叠(甚至 . 应该是可能的)

https://regex101.com/r/eR9kQ6/23