如何编写正则表达式提取含转义引号的指定结构文本内容
正则匹配解决方案
你之前编写的正则无法生效,核心原因有三点:
- 硬编码了
father|mother关键词,和实际场景的marker|abbreviation标识词完全不匹配 - 用
[^"]*匹配引号包裹内容时,没有处理转义引号\"的场景,遇到转义引号会提前终止匹配 - 没有覆盖连接词
for的场景,也没有适配字符串外层包裹引号、末尾带句号的冗余格式
可用正则表达式
以下正则兼容PCRE、JavaScript、Python等绝大多数主流正则引擎,支持转义引号识别、单/双引号包裹后缀、外层冗余字符过滤:
/^"?(.*?) is a (marker|abbreviation) (?:of|for) (?:"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)'|(.*?))"?\.?$/
替换时使用替换串:
$1 $2 $3$4$5
正则逻辑说明
^"?:匹配字符串开头可选的外层包裹双引号(.*?):非贪婪捕获标识词前的前缀内容is a (marker|abbreviation):匹配固定句式结构,捕获marker/abbreviation两个标识词(?:of|for):匹配标识词后的连接词of/for,不做捕获- 后缀内容匹配分三个分支,自动识别包裹格式:
"((?:[^"\\]|\\.)*)":匹配双引号包裹的后缀,支持识别转义字符(含转义双引号),捕获时自动剔除外层双引号'((?:[^'\\]|\\.)*)':匹配单引号包裹的后缀,支持识别转义字符,捕获时自动剔除外层单引号(.*?):匹配无引号包裹的纯文本后缀
"?\.?$:匹配字符串末尾可选的外层包裹双引号、可选的句尾点号
效果验证
- 核心用例输入:
"_,\"'() is a marker of \"'_( ,)\"."
替换输出:_,"'() marker \"'_( ,),和预期结果完全一致 - 示例2输入:
"Test is a marker for 'testing'"
替换输出:Test marker testing,和预期结果完全一致 - 示例3输入:
G is a abbreviation for "GDP ('Gross Domestic Product')"
替换输出:G abbreviation GDP ('Gross Domestic Product'),核心内容完全匹配,如需保留示例中G后的双空格,只需要把替换串中$1和$2之间的空格改成两个即可。
内容的提问来源于stack exchange,提问作者user879156
相关产品推荐
相关产品推荐

