Я должен признать, что регулярные выражения - не первый инструмент, о котором я бы подумал для этого. Я могу в значительной степени гарантировать, что любой RE, способный сделать это с несортированной рукой, будет гораздо более отвратительным и намного менее читаемым, чем эквивалентный процедурный код.
Если предположить, что карты отсортированы по номиналу (и они, по-видимому, в противном случае перечисленные вами регулярные выражения также не будут работать), и вы должны использовать регулярное выражение, можете использовать конструкция типа
2345A|23456|34567|...|9TJQK|TJQKA
для определения номинальной части руки.
Фактически, из того, что я собираю здесь"стандартных" рук, следует проверить следующее в порядке уменьшения приоритета:
Royal/straight flush: "(2345A|23456|34567|...|9TJQK|TJQKA)#(\\w)\\1{4}"
Four of a kind: ".*(\\w)\\1{3}.*#.*"
Full house: "((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*"
Flush: ".*#(\\w)\\1{4}"
Straight: "(2345A|23456|34567|...|9TJQK|TJQKA)#.*"
Three of a kind: ".*(\\w)\\1\\1.*#.*"
Two pair: ".*(\\w)\\1.*(\\w)\\2.*#.*"
One pair: ".*(\\w)\\1.*#.*"
High card: (none)
По сути, они такие же, как у вас, за исключением того, что я добавил флеш-рояль / стрит-флеш и стрит. При условии, что вы проверяете их по порядку, вы должны получить лучший результат с руки. Для старшей карты нет регулярных выражений, так как на данный момент это единственный счет, который вы можете получить.
Я также изменил прямолинейность стальных колес с A2345
на 2345A
, так как они будут отсортированы таким образом.