如何修改正则表达式以忽略引号,仅捕获指定目标文本内容?
解决正则捕获组提取不带引号键名的问题
Hey,我来帮你调整正则表达式,精准提取出不带双引号的键名(A、C、E),同时保持第二个捕获组的匹配结果不变(.B、.D、.F)。
问题根源分析
你原来的正则 (?:^|;)\s*([^=]*[^=\s])\s*=\s*([^;]*[^;\s]) 里,第一个捕获组 ([^=]*[^=\s]) 会把等号前所有非空白、非等号的内容全抓进来,包括包裹键名的双引号,所以才会得到 """A"" 这类带引号的结果。你之前试的 ([^=\"]*[^=\s]) 没起作用,是因为这个写法直接排除了所有双引号,但我们要的是捕获引号内部的内容,而不是把引号完全排除在外。
搞定需求的正则表达式
直接用这个正则就可以达到目标:
(?:^|;)\s*"([^"]+)"\s*=\s*([^;]*[^;\s])
关键改动解释
- 把第一个捕获组的逻辑改成了
"([^"]+)":- 先匹配开头的双引号
",然后用([^"]+)捕获双引号之间的所有非引号字符(也就是你需要的A、C、E),最后匹配结尾的双引号。 - 这样就完美跳过了包裹键名的引号,只捕获核心的键名内容。
- 先匹配开头的双引号
- 第二个捕获组
([^;]*[^;\s])完全保留,依然能准确匹配.B、.D、.F这些值。
测试效果
针对你的测试字符串 """A"" = .B; ""C"" = .D; ""E"" = .F"(这里看起来可能是输入时的引号重复笔误,不管是2个还是3个引号包裹键名,只要调整引号匹配的数量就行,比如3个引号的话改成 """([^"]+)"""),匹配后:
- 捕获组1结果:
A、C、E - 捕获组2结果:
.B、.D、.F
如果实际场景中键名是标准的双引号包裹(比如"A" = .B),上面的正则直接就能用,完全符合你的需求。
内容的提问来源于stack exchange,提问作者James B
相关产品推荐
相关产品推荐

