使用带lookarounds环视的条件正则匹配key-value中source字段取值
正则解决方案
直接使用如下正则即可覆盖你提到的三种场景,且自动排除值两侧的双引号,值的内容会落在第1捕获组或第2捕获组,合并两个分组的结果即可拿到最终的value:
\bsource(?:::|=)(?:"([^"]+)"|([^\s]+))
正则逻辑拆解
\bsource:匹配完整的source单词边界,避免被其他包含source的单词命中(?:::|=):匹配::或者=两种分隔符,非捕获组不占用结果分组- 后续分支逻辑:
- 分支1
"([^"]+)":匹配双引号包裹的内容,[^"]+匹配所有非双引号的字符(包含空格、你提到的特殊符号),捕获组1直接拿到引号内部的内容,自动排除外层双引号 - 分支2
([^\s]+):匹配无引号的内容,[^\s]+匹配所有非空白字符,刚好对应无空格的取值场景,捕获组2拿到最终值
- 分支1
匹配测试结果
针对你提供的三个样本,匹配结果如下:
- 样本1
source="source name with quotes - special characters also":捕获组1拿到source name with quotes - special characters also - 样本2
source=source_name_without_quotes_with_special-characters*:捕获组2拿到source_name_without_quotes_with_special-characters* - 样本3
source="source_name_with_quotes_no_spaces-*":捕获组1拿到source_name_with_quotes_no_spaces-*
使用说明
实际代码调用时,判断如果捕获组1有值就取组1,否则取组2即可,不需要额外做引号去除的处理。如果你的正则引擎支持命名捕获组,可以优化为如下写法,直接取value分组即可:
\bsource(?:::|=)(?:"(?<value>[^"]+)"|(?<value>[^\s]+))
内容的提问来源于stack exchange,提问作者Tensore
相关产品推荐
相关产品推荐

