如何使用单条正则表达式捕获不在单引号内的分隔符
单条正则匹配非单引号包裹内分隔符的实现方案
你之前尝试的(.[^']&[^'])存在明显局限性:仅能匹配&前后都不是单引号的场景,无法处理单引号包裹内容中存在多字符、或者分隔符紧邻单引号的情况,也没有全局判断单引号配对状态,所以无法满足需求。
你可以使用基于环视断言的正则表达式实现需求,不需要提前处理引号内内容,单条正则即可准确匹配符合要求的&分隔符:
&(?=(?:[^']*'[^']*')*[^']*$)
规则说明
- 核心逻辑:判断
&后方的单引号是否为偶数个,若为偶数则说明当前&不在单引号包裹范围内 - 各部分拆解:
- 开头的
&:匹配目标分隔符本身 (?=...):正向肯定环视,仅做规则判断不消耗字符,不会影响后续拆分结果(?:[^']*'[^']*')*:匹配任意组成对出现的单引号(每组由「非单引号内容+左单引号+非单引号内容+右单引号」组成)[^']*$:匹配从当前位置到字符串结尾的所有非单引号内容,保证最后没有多余的未闭合单引号
- 开头的
效果验证
针对你给出的示例字符串example=3&testing='f&tmp':
- 第一个
&后方的单引号为2个(偶数),会被正则匹配到 - 第二个
&在单引号内部,后方的单引号为1个(奇数),不会被匹配 - 用该正则拆分字符串即可直接得到你需要的结果:
["example=3", "testing='f&tmp'"]
注意事项
上述规则默认你的业务场景中单引号都是成对闭合、且没有转义单引号(如\')的情况。如果存在转义单引号的需求,需要额外在规则中加入转义字符的判断逻辑。
内容的提问来源于stack exchange,提问作者Anish Govind
相关产品推荐
相关产品推荐

