我有这个字符串:
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预处理,我只需要处理一些情况。而已。谢谢你的帮助。
答案 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)
有时我们需要将数据拆分为记录,并在输入记录分隔符($ /)上进行简单拆分或其他一些值失败,因为我们拆分的值可能允许在数据的其他部分中使用。也许他们被引用了。也许它们嵌入了其他不应分割的数据中。
此模块允许您指定要分割数据的内容,还可以指定“除非”正则表达式。如果相关文本与“除非”正则表达式匹配,则不会在那里拆分。这允许我们执行拆分换行符之类的操作,除非在引号中嵌入换行符。