You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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?$:匹配可选的结束界定符,若不存在则说明字符串未终止(行尾无对应闭合引号)

测试验证

  1. 测试"this i""s a ' '' nnoying":正则从开头"匹配到结尾",中间单引号和''均被视为字符串内容,无错误匹配
  2. 测试'test string which " is totally invalid ':行尾无闭合',正则匹配整行,正确识别为未终止字符串
  3. 测试'test string which " is totally invalid "':行尾有闭合',正则匹配完整字符串,不会误判为未终止

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:25:27