如何用Python正则检测未终止字符串?解决引号匹配与转义问题
检测代码行中未终止的字符串(支持双引号/单引号及转义)
问题背景
逐行读取代码源文件时,需要检测某一行是否存在未终止字符串(即字符串延续到下一行)。字符串可由"或'开头,且规定重复两次的引号(""或'')为转义字符。现有正则无法正确区分当前字符串的界定符类型,导致误判。
现有正则的缺陷
第一种正则
(?:\"(?:[^\"]|\"\")+$)|(?:'(?:[^']|'')+$)
在测试用例"this i""s a ' '' nnoying"中会误匹配中间片段,因为正则无法感知当前处于双引号字符串内部,会把单引号区域当成新的未终止字符串。
第二种正则
(?:("|')(?:[^"]|"")+$)
在测试用例'test string which " is totally invalid "'中失败,因为未区分捕获到的界定符类型,错误地将双引号视为当前单引号字符串的终止符。
解决方案:使用反向引用锁定界定符
利用正则的反向引用,捕获开头的引号类型后,后续仅以该引号作为终止符判断依据,同时兼容转义的重复引号。
最终正则(Python风格)
(["'])(?:(?!\1|\1{2}).|\1{2})*\1?$
正则逻辑拆解
(["']):捕获分组1,匹配双引号或单引号,确定当前字符串的界定符(?:(?!\1|\1{2}).|\1{2})*:非捕获分组,匹配字符串内容(重复任意次)(?!\1|\1{2}).:负向前瞻确保当前字符不是单个未转义的界定符,随后匹配任意字符|\1{2}:匹配两个连续的界定符(转义的引号)
\1?$:匹配可选的结束界定符,若不存在则说明字符串未终止(行尾无对应闭合引号)
测试验证
- 测试
"this i""s a ' '' nnoying":正则从开头"匹配到结尾",中间单引号和''均被视为字符串内容,无错误匹配 - 测试
'test string which " is totally invalid ':行尾无闭合',正则匹配整行,正确识别为未终止字符串 - 测试
'test string which " is totally invalid "':行尾有闭合',正则匹配完整字符串,不会误判为未终止
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

