如何编写正则表达式将多个单词捕获到独立指定分组
正则捕获同分类多单词方案
问题本质
你当前使用的正则(category \b(\w+)\b )((\b\w+\b)+)无法拿到同分类下所有单词,是正则捕获组的默认机制导致:重复匹配的捕获组只会保留最后一次匹配的内容,最终你只会拿到每个分类下最后一个单词(orange/duck),前面的pear、beef都会被覆盖。
待匹配的目标文本如下:
category fruits pear orange category meat beef duck
需求是将pear orange、beef duck这类同属一个分类的多个单词,捕获到独立分组中。
可用正则方案
方案1:支持\G锚点的引擎(PCRE、Python、Java、.NET等)
使用连续匹配锚点\G逐个捕获分类下的条目,不会出现内容覆盖,正则写法:
(?:^category\s+(\w+)|(?!^)\G)\s+(\w+)
分组规则:
- 分组1:捕获分类名称,即
fruits/meat - 分组2:每执行一次匹配,就捕获一个当前分类下的条目,依次得到
pear、orange、beef、duck,所有条目独立捕获无覆盖
匹配逻辑:
- 非捕获组分两个分支:要么匹配行首的
category + 分类名作为匹配起点,要么从上一次匹配结束的位置继续向后匹配,不会跨分类串匹配 - 每次匹配自动捕获后方紧跟的一个单词到分组2,直到当前行末尾结束
方案2:不支持\G锚点的引擎(如旧版JavaScript)
先匹配整行拿到分类名和对应所有条目的整段文本,再做简单拆分即可,正则写法:
^category\s+(\w+)\s+(.+)$
分组规则:
- 分组1:捕获分类名称
- 分组2:捕获当前分类下所有条目的整段字符串,拿到结果后用空白符
\s+做分隔符拆分,就能得到独立的条目单词列表
注意事项
正则本身不支持单个捕获组在一次匹配中存储多个不覆盖的值,不要尝试写固定数量的捕获组适配可变长度的条目列表,要么用
\G连续匹配逐个捕获,要么先抓整段内容再做拆分,两种方案都能满足需求。
内容的提问来源于stack exchange,提问作者user310291
相关产品推荐
相关产品推荐

