如何在Perl中忽略引号/括号内逗号,正确拆分逗号分隔字符串
解决带引号/括号的逗号分隔字符串拆分问题
要处理这种同时包含引号内逗号、括号内逗号的分隔字符串,普通CSV解析模块(比如Parse::CSV、Text::ParseWords)无法覆盖括号场景,单纯正则也很难兼顾所有嵌套/引用情况。推荐用Text::Balanced模块,它能精准识别嵌套结构(括号、引号),轻松跳过内部的分隔符。
实现代码
use strict; use warnings; use Text::Balanced qw(extract_multiple extract_quotelike extract_bracketed); my $string = "10507, STAGE, 'SELECT,PRTNR_CNTC_KEY',SQL_EXPORT_COUNT, EXPORT_LOG_MSG, NAME(FIRST,LAST)"; # 定义匹配规则:单引号字符串、括号内容、普通字段 my @parts = extract_multiple( $string, [ sub { extract_quotelike($_[0], q{'}) }, # 匹配单引号包裹的内容 sub { extract_bracketed($_[0], '()') }, # 匹配括号包裹的内容 qr/[^,\s]+(?:\s+[^,\s]+)*/, # 匹配普通字段(允许内部空格) ], { skip => qr/\s*,\s*/ } # 跳过逗号及前后空格 ); # 输出结果 foreach my $i (0..$#parts) { print "字段", $i+1, ": ", $parts[$i], "\n"; }
输出结果
字段1: 10507 字段2: STAGE 字段3: 'SELECT,PRTNR_CNTC_KEY' 字段4: SQL_EXPORT_COUNT 字段5: EXPORT_LOG_MSG 字段6: NAME(FIRST,LAST)
扩展适配(双引号、方括号)
如果未来需要支持双引号或方括号,只需在匹配规则里添加对应的解析逻辑:
- 双引号:
sub { extract_quotelike($_[0], q{"}) } - 方括号:
sub { extract_bracketed($_[0], '[]') }
把这些规则加入到extract_multiple的规则数组中即可,模块会自动按优先级匹配对应的结构,完全不需要复杂的正则嵌套。
内容的提问来源于stack exchange,提问作者James Finnegan
相关产品推荐
相关产品推荐

