如何用正则匹配所有单词,排除被双引号包裹的内容
可以用双引号计数断言实现差集匹配,不需要复杂的多正则结果计算,单条正则就能完成:
[a-z_]+(?=(?:[^"]*"[^"]*")*[^"]*$)
实现逻辑
- 基础匹配部分保留你原来的
[a-z_]+,适配你要的小写+下划线的单词规则 - 末尾的零宽正向断言用来做过滤:它会统计当前匹配位置之后的双引号数量,如果是偶数,就说明当前匹配的单词不在双引号包裹的区间内,反之则跳过。
匹配效果
对你提供的测试文本:
results[0].items[0].packages[0].settings["compiler.version"]会匹配到:results、items、packages、settingsresults[0].items[0].packages[0].settings.build_type会匹配到:results、items、packages、settings、build_type
完全符合你要排除双引号内内容的要求。
如果你的运行环境支持变长负向后视(Python、Java、ES2018+ JS等环境都支持),也可以用更直白的写法,效果一致:
(?<!".*)[a-z_]+
内容的提问来源于stack exchange,提问作者jlo。
相关产品推荐
相关产品推荐

