正则表达式匹配双引号内外孤立左单引号(‘)的技术咨询
优化正则表达式匹配孤立左单引号
需求明确
需要匹配孤立左单引号(‘),无论其位于双引号(“”)内部还是外部,规则如下:
- 双引号外的孤立左单引号:左单引号后,到下一个左单引号或行尾前,不存在非缩写形式的右单引号(’);缩写定义为
’后紧跟字母的情况(如‘this’s中的’属于缩写,不视为匹配的右单引号) - 双引号内的孤立左单引号:左单引号后,到下一个左单引号、右双引号或行尾前,不存在非缩写形式的右单引号
原正则问题分析
原正则(“[^“]+?”[^‘]*)*‘(.(?!’[^A-Za-z]))+(‘|$)存在以下缺陷:
- 未处理双引号内的终止条件(右双引号),导致双引号内的孤立左单引号无法被正确识别
- 行边界处理逻辑不完善,无法准确匹配行尾前的孤立左单引号
- 未考虑多左单引号连续出现的场景匹配
优化后的正则表达式
(?:"[^"]*?"|[^"‘’])*‘(?:(?!’[A-Za-z]|["‘’]))*(?=["‘’]|$)
正则逻辑解释
(?:"[^"]*?"|[^"‘’])*- 匹配两种内容:完整的双引号包裹文本(
"[^"]*?"),或非双引号、非单引号的普通文本([^"‘’]) - 重复匹配直到定位到目标左单引号的位置
- 匹配两种内容:完整的双引号包裹文本(
‘- 匹配目标孤立左单引号
(?:(?!’[A-Za-z]|["‘’]))*- 匹配任意字符,只要该字符后不是以下内容:
- 非缩写的右单引号:
’后接非字母(排除缩写场景) - 右双引号、左单引号(终止条件)
- 非缩写的右单引号:
- 确保当前左单引号后没有有效的匹配右单引号
- 匹配任意字符,只要该字符后不是以下内容:
(?=["‘’]|$)- 正向环视,确保当前位置后是右双引号、左单引号或行尾,符合孤立左单引号的终止规则
测试验证
针对提供的测试用例,上述正则可准确匹配所有符合定义的孤立左单引号,例如:
- 双引号外场景:
一些文本和"双引号" 以及一个‘孤立左单引号中的‘ - 双引号内场景:
"双引号, 内部包含一个‘孤立左单引号。"中的‘ - 含缩写的场景:
一些文本和一个‘孤立左单引号和一个’缩写词中的‘
内容的提问来源于stack exchange,提问作者vr8ce
相关产品推荐
相关产品推荐

