Regex 使用正则表达式确定用户在扑克牌中是否有两对

Regex 使用正则表达式确定用户在扑克牌中是否有两对,regex,Regex,给定一张五张牌的扑克手牌A23456789TJQK,我可以使用正则表达式通过执行以下操作来查找手牌中是否有一对牌: .*(.).*\1 这是通过引用捕获的组或卡来实现的——如果重复,则正则表达式成功,如果不成功,则不成功 然而,当有两对时,它变得有点困难。我首先通过做一个类似的捕获组来开始我的方法,然后检查\2是否存在,但是如果有3个或4个这样的类型,这就不起作用了——有时可能会将其误认为是2对 对于一只无序的手来说,什么样的正则表达式才是查看它是否包含两个(不同)对的好方法?您可以使用多个

给定一张五张牌的扑克手牌
A23456789TJQK
,我可以使用正则表达式通过执行以下操作来查找手牌中是否有一对牌:

.*(.).*\1

这是通过引用捕获的组或卡来实现的——如果重复,则正则表达式成功,如果不成功,则不成功

然而,当有两对时,它变得有点困难。我首先通过做一个类似的捕获组来开始我的方法,然后检查
\2
是否存在,但是如果有3个或4个这样的类型,这就不起作用了——有时可能会将其误认为是2对


对于一只无序的手来说,什么样的正则表达式才是查看它是否包含两个(不同)对的好方法?

您可以使用多个反向引用来完成此操作

看到它在使用吗

其工作原理如下:

  • ^
    在行首断言位置
  • (?!*()(?:*?\1){2})
    负前瞻确保不存在三重匹配
  • (?=.*().*?\2)
    正向前瞻确保字符串中存在一对字符
  • (?=.*(?!\2)().*?\3)
    正向前瞻确保字符串中存在一对不同于第一对(来自上一个正向前瞻)的字符
  • *
    匹配字符串

您将禁止赌场使用正则表达式。也许您可以先对它们进行排序,然后使用
(。与
()(?=.*?\1)。*?(?!\1)().*?。\2
@ctwheels酷,准备好后将其放入答案中!再次感谢你的回答。关于这一点的一个问题是,为什么在上面使用lazy
*
s?如果这些人反而贪婪,会发生什么?@samuelbrody1249我刚刚意识到我的逻辑有点缺陷。我更新了它,包括一个字符出现两次以上的修复。谢谢更新。对于所有的lookaheads来说,这个问题比我想象的要复杂得多……另一方面,你是如何变得如此擅长正则表达式的?我觉得它与SQL或编程语言有很大的不同,而“让它工作”的很多方面都是运用各种技巧和创造性的。@samuelbrody1249老实说,我不知道。我经常进行字符串操作,并在这里或那里复制/粘贴奇怪的正则表达式,但从来没有认真考虑过。有一天,我想我需要一些更复杂的东西,深入研究后就迷路了。从那以后我就再也找不到出路了。这里有很多资源,但我发现StackOverflow(以及教其他人)帮助我更流利地使用正则表达式。而且,他是这个行业中最好的一个,所以请检查标签并查找他的名字(评论、答案等)-他很棒。
^(?!.*?(.)(?:.*?\1){2})(?=.*?(.).*?\2)(?=.*?(?!\2)(.).*?\3).*