正则表达式如何匹配由\s;\s分隔的动态数量未知的全部分组
正则匹配多分组规则编写方案
你之前的写法存在两个核心问题:
- 否定前瞻语法错误,正确的否定前瞻语法为
(?!pattern),你将感叹号误写在捕获组内部 - 锚定了行首符号
^,只能匹配行首位置的内容,自然无法捕获全部分组
无嵌套括号场景最优方案
如果你的分组内容不存在嵌套括号,直接用以下正则匹配所有分组即可:
\([^)]+\)
规则解释:
\(匹配分组开头的左括号[^)]+匹配除右括号外的1个及以上任意字符,覆盖分组内所有内容\)匹配分组结尾的右括号
需基于\s;\s分隔符匹配的场景
如果分组内容存在特殊字符需要严格按照分隔符拆分,有两种实现方式:
- 优先用编程语言的字符串拆分能力,直接以
\s;\s为分隔符拆分整行,得到的结果就是全部分组,实现成本最低 - 必须用正则匹配的场景,使用以下规则:
(?:^|;\s)\K[^;]+?(?=\s*(?:;|$))
规则解释:
(?:^|;\s)非捕获组,匹配行首或者分隔符的;前缀\K重置匹配起始位置,前面的内容不会计入最终匹配结果[^;]+?非贪婪匹配所有非分号字符,即分组内容(?=\s*(?:;|$))正向预查,确认当前内容后面要么是分隔符,要么是行尾,避免匹配越界
测试用例输入:(group1) ; (group2 with space) ; (group3-special) ; (末尾分组)
匹配输出结果:
(group1)(group2 with space)(group3-special)(末尾分组)
内容的提问来源于stack exchange,提问作者Lucosa
相关产品推荐
相关产品推荐

