You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式捕获可变数量扑克牌字符组问题求助

解决方案

核心思路

你遇到的问题是重复捕获组仅会保留最后一次匹配结果,因此需要先匹配整个牌组的原始内容,再拆分出每张牌;或者结合全局匹配直接提取所有牌项。以下是适配需求的正则方案:

整行匹配正则(提取玩家、动作、牌组)

^(.*?)\s?:\s?(folds|checks)(?:\s+\[((?:[\dJQKTAdsch]{2}\s*)+)\])?\s*$

分组说明:

  • 第1组:玩家名称(匹配冒号前的所有内容,自动忽略前后冗余空格)
  • 第2组:动作(精确匹配folds或checks)
  • 第3组:可选牌组内容(匹配方括号内的所有牌字符串,比如Ah 4d 6s)

拿到第3组内容后,再用[\dJQKTAdsch]{2}做全局匹配,即可拆分出每张单独的牌。

单独提取牌的正则(针对[Ah 4d 6s]这类字符串)

如果只需要从带方括号的牌组中提取单张牌,直接用全局匹配以下正则即可:

[\dJQKTAdsch]{2}

该正则不受方括号和空格影响,能精准匹配所有符合规则的牌。

示例用法(Python)

import re

# 匹配整行的正则
line_regex = re.compile(r'^(.*?)\s?:\s?(folds|checks)(?:\s+\[((?:[\dJQKTAdsch]{2}\s*)+)\])?\s*$')
# 提取单张牌的正则
card_regex = re.compile(r'[\dJQKTAdsch]{2}')

test_data = [
    "mddgfc: checks ",
    "Tomi1981: folds ",
    "DJPOPS613: folds [Ad] ",
    "DJPOPS613: folds [Qh Qc] ",
    "SchuDani: folds [2c As Ts] ",
    "anshovel: folds [Ad 5d 4h 8h] ",
    "pokerpummi: folds [2c 5h Ac 6d 7s]"
]

for line in test_data:
    match_result = line_regex.match(line)
    if match_result:
        player = match_result.group(1)
        action = match_result.group(2)
        card_raw = match_result.group(3)
        cards = card_regex.findall(card_raw) if card_raw else []
        print(f"{player}: {action} {cards}")

输出结果:

mddgfc: checks []
Tomi1981: folds []
DJPOPS613: folds ['Ad']
DJPOPS613: folds ['Qh', 'Qc']
SchuDani: folds ['2c', 'As', 'Ts']
anshovel: folds ['Ad', '5d', '4h', '8h']
pokerpummi: folds ['2c', '5h', 'Ac', '6d', '7s']

原正则错误原因

你之前写的\[([\dJQKTAdsch]{2}){1,}\]中,([\dJQKTAdsch]{2}){1,}属于重复捕获组,正则引擎仅会记录该组最后一次匹配的内容(比如[Ah 4d 6s]只会抓到6s)。解决思路要么将重复内容包裹进一个非捕获组的大容器中(如\[((?:[\dJQKTAdsch]{2}\s*)+)\]),要么用全局匹配单独提取每张牌。

内容的提问来源于stack exchange,提问作者mgillett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:05:05