正则问题:如何匹配含转义单引号的单引号包裹内容?
匹配转义单引号包裹字符串的正则解决方案
问题背景
需要编写正则匹配字符串中被单引号包裹的内容,其中单引号通过另一个单引号转义。比如示例字符串:
The quick 'brown fox ''jumped ''''over the lazy dog'''
期望完整捕获:'brown fox ''jumped ''''over the lazy dog''',但原正则(?<!\')\'(?!\').+(?<!\')\'(?!\')在结尾单引号前存在转义单引号时失效。
核心问题分析
原正则的(?<!\')负向断言仅检查前一个字符不是单引号,但转义单引号是成对出现的(''),当结尾的有效单引号前有偶数个连续单引号时,(?<!\')会误判为“前面是单引号”,导致无法匹配到正确的结束位置。
解决方案
推荐正则(直接匹配完整包裹内容)
'(?:''|[^'])*'
各部分解释
':匹配起始的未转义单引号(?:''|[^'])*:非捕获分组,循环匹配两种情况:'':转义的成对单引号[^']:任何非单引号字符
这个逻辑能确保中间内容只会跳过转义的单引号,直到遇到第一个单独的未转义单引号
':匹配结尾的未转义单引号
针对你的断言修改需求
如果一定要通过调整负向断言实现“匹配前面有0个或偶数个单引号的单引号”,可以用如下写法(需开启单行模式让.匹配换行符):
'(?s).+(?<=(^|[^'])('')*)'
不过这种写法依赖回溯,效率不如前面的分组方案,因此更推荐第一种实现方式。
测试验证
将推荐正则应用到示例字符串,会精准捕获目标内容:'brown fox ''jumped ''''over the lazy dog''',完全符合需求。
内容的提问来源于stack exchange,提问作者ceckenrode
相关产品推荐
相关产品推荐

