任意顺序的正则表达式匹配

5
我正在编写一个程序来识别你在玩扑克牌时的手牌。我正在创建一个模式对象,以检查五张牌,每张牌由点数和花色定义。例如,黑桃A可以表示为As。我已经有了以下代码来识别顺子,但它只能在有序的情况下工作。我该如何让它识别像5d4sAc3s2h这样的字符串为顺子?谢谢任何帮助!
Pattern[] floppedStraightCheck;
floppedStraightCheck = new Pattern[10];
floppedStraightCheck[0] = Pattern.compile("(([aA][scdhSCDH])([2][scdhSCDH])([3][scdhSCDH])([4][scdhSCDH])([5][scdhSCDH])");

2
说实话,正则表达式似乎不是解决这个问题的最佳方案。首先解析字符串(正则表达式可能有所帮助,但应该足够简单,可以不用正则表达式),创建一个CardInfo对象数组(或类似对象),然后分析该数组以查看它是否为顺子、葫芦等。 - p.s.w.g
1
是的,字符串可能不是表示手牌的最佳方式。 - Maurice Perry
1
听起来你正在尝试将核心应用逻辑放在一个正则表达式中。相反,你应该编写方法,这样会更易读和可维护。 - Bhesh Gurung
谢谢大家的帮助。你们可能已经注意到,我还是个新手,正在努力理解哪种工具在什么情况下最适合我使用。这一切都非常有帮助。 - user3525625
2个回答

2

我必须完全同意上面发布的评论。我认为使用正则表达式不是组成这个的合适方式。我还建议您使用手动方法而不是字符串。在这种情况下,您可以学到关于正则表达式的重要知识是何时使用它们。


1

对于正则表达式来说,这并不是一个很好的任务。您有多个and条件,可以使用正向前瞻来实现。

^(?=.*[aA][scdhSCDH])(?=.*2[scdhSCDH])(?=.*3[scdhSCDH])(?=.*4[scdhSCDH])(?=.*5[scdhSCDH]).{10}$

Regular expression visualization

Debuggex演示

较短的版本为:

^(?=(..)*[aA])(?=(..)*2)(?=(..)*3)(?=(..)*4)(?=(..)*5)(.[scdhSCDH]){5}$

Regular expression visualization

Debuggex演示


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