正则表达式匹配需求:标准化键值对分隔符,支持引号内内容
标准化不规范键值对分隔符(支持引号内值保留)
可以使用以下正则表达式匹配并替换所有不符合规范的键值对分隔符,同时保证引号内的内容不受修改:
(?=.*[:=])[\s:=]+(?=(?:[^'"]*(['"])[^'"]*\1)*[^'"]*$)
将匹配到的内容替换为单个无空格的等号=即可完成标准化。
正则规则解释
(?=.*[:=]):正向预查,确保当前匹配的字符序列中至少包含一个=或:,避免误匹配纯空格的非键值对场景[\s:=]+:匹配一个或多个由空格、=、:组成的任意组合(即所有不规范的分隔符形式)(?=(?:[^'"]*(['"])[^'"]*\1)*[^'"]*$):正向预查,确保当前匹配的分隔符不在成对的单/双引号内部,保证引号内的特殊字符(包括=、空格)不会被篡改
测试验证
| 输入示例 | 替换后结果 |
|---|---|
key = value | key=value |
key: value | key=value |
key == value | key=value |
key ::=== = = == value | key=value |
message = "this message has an = in it" | message="this message has an = in it" |
name = 'John : Doe' | name='John : Doe' |
key value(纯空格) | 保持原样(无匹配,因为不含=/:) |
场景适配
如果仅需处理双引号(无需支持单引号),可以简化正则为:
(?=.*[:=])[\s:=]+(?=(?:[^"]*"[^"]*")*[^"]*$)
注意替换时需开启全局匹配模式(如Python中的re.sub默认全局替换,其他语言需对应开启全局标识)
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

