用逗号分隔逗号分隔列表,在逗号中嵌入引号参数

时间:2012-03-24 20:03:48

标签: regex perl split

我有这个字符串:

my $string = "2, 16, \"d4,d6\", \"d20,d22\", [0]";

我使用拆分:

my @arglist = split(/,/, $string);

问题是,最初我从未在引号字符串中嵌入这些逗号,现在我已经和我需要更新该分裂正则表达式来处理这种情况。

,除了我要求之外,绝对不要提及任何其他内容。我已经搜索了足够多,一半以上的答案是关于复杂的CSV解析等等的噪音。我没有写那个我需要修复的脚本,我想要的是修改那个做拆分的单行,所以它应该这是一个简单的正则表达式。没有任何更新,它分割的文本只会是这样:

CHROMA_MC_X \width, \align, "d4,d5,d6,d7", "d20,d21,d22,d23"
CHROMA_MC_X \width, \align, "d4,d6", "d20,d22", [0]
CHROMA_MC_X \width, \align, "d4,d6", "d20,d22", [0]




修改的   Birei的答案足以从一开始。我最终烹饪这个正则表达式完全处理我的情况:

my @arglist = $3 =~ m/(?:(?<=")[^"]*(?=(?:\s*"\s*,|\s*"\s*$)))|(?<=,)(?:[^",]*(?=(?:\s*,|\s*$)))|(?<=^)(?:[^",]+(?=(?:\s*,|\s*$)))|(?<=^)(?:[^",]*(?=(?:\s*,)))/g;

它看起来很乱,但它完全符合我的需要。它将引用的列表与comas匹配并返回它们而没有引号,有一些问题可能存在空args并且这个正则表达式很乱,因为它只处理这些情况并避免错误在perl正则表达式中没有实现的可变长度lookbehind。

我没有得到:所有这些downvotes的原因是什么,我受到一些perl大师的攻击,他们认为我不知道我需要什么以及我要求什么?!我有一些工具可以进行一些asm预处理,我只需要处理一些情况。而已。谢谢你的帮助。

3 个答案:

答案 0 :(得分:7)

一种方式:

script.pl的内容:

use warnings;
use strict;

my $string = "2, 16, \"d4,d6\", \"d20,d22\", [0]";
my @arglist = $string =~ m/("[^"]+"|[^,]+)(?:,\s*)?/g;
printf qq[%s\n], join qq[\n], @arglist;

像以下一样运行:

perl script.pl

以下结果:

2
16
"d4,d6"
"d20,d22"
[0]

答案 1 :(得分:6)

你说除了split之外你不想做任何事情,但Text::CSV_XS处理这个问题就好了。也许你不喜欢这个问题的答案,无论你遇到什么情感因素,但其他人可能会欣赏它。请记住,这不是一个帮助您解决问题的网站,它是一个帮助每个人的网站。

use Text::CSV_XS;

my $csv = Text::CSV_XS->new(
    {
    allow_whitespace => 1,
    }
    ) or die "Cannot use CSV: ".Text::CSV_XS->error_diag;

$" = "\n";
while( my $row = $csv->getline( $filehandle ) ) {
    say "@$row\n";
    }

答案 2 :(得分:5)

Data::Record

  

有时我们需要将数据拆分为记录,并在输入记录分隔符($ /)上进行简单拆分或其他一些值失败,因为我们拆分的值可能允许在数据的其他部分中使用。也许他们被引用了。也许它们嵌入了其他不应分割的数据中。

     

此模块允许您指定要分割数据的内容,还可以指定“除非”正则表达式。如果相关文本与“除非”正则表达式匹配,则不会在那里拆分。这允许我们执行拆分换行符之类的操作,除非在引号中嵌入换行符。