如何编写正则表达式提取带可选引号的元组元素?
提取带可选引号的元组元素的正则方案
针对提取逗号分隔元组元素的需求——每个元组包含三个元素(数字/空字符串、文本/空字符串、数字/空字符串),且文本含逗号或空格时会被可选双引号包裹,原正则\((.*?),"?(.*?)?",(.*?)\)失效的核心原因是:非贪婪匹配.*?遇到文本内的逗号就会提前终止,无法完整捕获带逗号的引号包裹文本。
可以使用以下正则表达式解决问题:
\(([^,]*),(".*?"|[^",]*),([^)]*)\)
正则各部分说明
\(:匹配元组开头的左括号([^,]*):捕获第一个元素,匹配除逗号外的任意字符(支持空值),:匹配第一个元素与第二个元素之间的逗号分隔符(".*?"|[^",]*):捕获第二个元素,采用分支匹配逻辑:".*?":优先匹配带双引号的文本,内部可包含逗号、空格等任意字符[^",]*:匹配不带引号的文本,仅允许除逗号、双引号外的字符(支持空值)
,:匹配第二个元素与第三个元素之间的逗号分隔符([^)]*):捕获第三个元素,匹配除右括号外的任意字符(支持空值)\):匹配元组结尾的右括号
测试验证
以示例输入(1,Item1,1),(,"Item 2",2),(3,"With,comma",3)为例,该正则可正确提取每组元素:
- 第一组:
1、Item1、1 - 第二组:空字符串、
"Item 2"(可按需后续处理去除引号)、2 - 第三组:
3、"With,comma"、3
若需要自动去除第二个元素的引号,可调整正则为:
\(([^,]*),"?([^"]*)"?,(.*?)\)
(注:此调整仅适用于引号完整包裹文本的场景,若文本内存在未转义的引号则不适用)
内容的提问来源于stack exchange,提问作者Sergey Shevchenko
相关产品推荐
相关产品推荐

