如何用Python正则将拼接字符串的引号替换为C++原始字符串分隔符?
解决C++拼接字符串转原始字符串的正则方案
先明确输入输出的典型场景,确保匹配你的需求:
输入示例
// 带外层括号的拼接 ("This is a \"quoted\" word" " followed by another part") // 无外层括号的直接拼接 "Line 1\\nLine 2" " and more text with \"escaped\" quotes"
期望输出
// 对应带括号输入的输出 R"(This is a "quoted" word followed by another part)" // 对应无括号输入的输出 R"(Line 1\nLine 2 and more text with "escaped" quotes)"
方案1:支持回调函数的编程场景(Python/Node.js等)
这类场景可以利用正则匹配+自定义逻辑拼接,处理最复杂的情况:
匹配正则
^\(\s*(?:"(?:\\.|[^"])*"\s*)+\)$|(?:"(?:\\.|[^"])*"\s*)+
这个正则同时匹配两种情况:带外层括号的拼接字符串、无括号的直接拼接字符串。
替换逻辑代码(Python示例)
import re def convert_to_raw_string(match): # 提取所有拼接片段的内容(去掉引号) segments = re.findall(r'"((?:\\.|[^"])*)"', match.group()) # 拼接所有片段并包裹成原始字符串格式 return f'R"({"".join(segments)})"' # 测试带括号的情况 input_with_paren = '("Hello \"world\"" " this is a" " concatenated string")' print(re.sub(r'^\(\s*(?:"(?:\\.|[^"])*"\s*)+\)$', convert_to_raw_string, input_with_paren)) # 测试无括号的情况 input_no_paren = '"Line 1\\nLine 2" " and more text with \\"escaped\\" quotes"' print(re.sub(r'(?:"(?:\\.|[^"])*"\s*)+', convert_to_raw_string, input_no_paren))
方案2:编辑器纯正则替换(VS Code/Sublime Text等)
如果只用编辑器的替换功能,分三步操作:
移除外层括号(如果有)
- 查找:
^\(\s*(.*?)\s*\)$ - 替换:
$1
执行一次即可去掉拼接字符串外层的括号。
- 查找:
合并拼接的字符串片段
- 查找:
"((?:\\.|[^"])*)"\s*" - 替换:
$1
重复点击「替换全部」,直到没有匹配结果,这一步会把所有"a" "b"合并成ab的内容。
- 查找:
转换为原始字符串格式
- 查找:
"((?:\\.|[^"])*)" - 替换:
R"($1)"
执行一次即可把合并后的普通字符串转为C++原始字符串。
- 查找:
关键正则说明
(?:\\.|[^"])*:核心匹配规则,用来正确捕获字符串内容——\\.匹配转义字符(包括\"、\\等),[^"]匹配非引号的普通字符,避免错误截断转义引号。- 所有操作都会保留原字符串中的转义语义:比如原字符串的
\"会在原始字符串中自动变为"(符合C++原始字符串的语法要求),\\会保留为\\,确保最终字符串的实际内容和原拼接字符串完全一致。
内容的提问来源于stack exchange,提问作者JE_Muc
相关产品推荐
相关产品推荐

