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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:30:26