正则如何正确匹配非行首、前后无分号的双引号?
问题原因
你之前编写的正则存在两个核心错误:
- 第一版
(?<![;])([^^])(")(?![;])错误使用[^^]实现非行首判断,这个写法实际匹配的是除了^符号本身的任意单个字符,不属于位置判断逻辑,还会额外捕获双引号前的一个字符,属于语法误用。 - 第二版
(?<![;])(")(?![;])仅实现了「双引号前后不紧邻分号」的判断,没有加入「双引号不在行起始位置」的位置校验,因此会错误匹配行首的双引号。
正确正则写法
通过组合负向零宽断言即可同时满足三个匹配条件,正则如下:
(?<!^)(?<!;)"(?!;)
各部分逻辑说明:
(?<!^):负向后行断言,校验当前双引号的前侧不是行起始位置,满足「不在行首」的要求(?<!;):负向后行断言,校验当前双引号前紧邻的字符不是分号,满足「前不紧邻分号」的要求":匹配目标双引号字符(?!;):负向前瞻断言,校验当前双引号后紧邻的字符不是分号,满足「后不紧跟分号」的要求
注意:如果待匹配内容为多行文本,需要开启正则的多行模式(m修饰符),此时^才能正确识别每一行的起始位置,而非仅匹配整个文本的开头。
匹配效果验证
对应你给出的测试用例,匹配结果完全符合预期:
- 行内容:
"Best Before:双引号位于行首,被(?<!^)规则拦截,不匹配 - 行内容:
Best Before";:双引号后紧跟分号,被(?!;)规则拦截,不匹配 - 行内容:
;"Best "Before:紧跟分号后的第一个双引号,前侧紧邻分号,被(?<!;)规则拦截,不匹配 - 行内容:
Best "Before:双引号不在行首,前后均不紧邻分号,正常匹配
内容的提问来源于stack exchange,提问作者PiccionePolemico
相关产品推荐
相关产品推荐

