我有这个字符串:
my $string = "2, 16, \"d4,d6\", \"d20,d22\", [0]";
Run Code Online (Sandbox Code Playgroud)
我使用拆分:
my @arglist = split(/,/, $string);
Run Code Online (Sandbox Code Playgroud)
问题是,最初我从未将这些逗号嵌入到带引号的字符串中,现在我已经和我需要更新该分裂正则表达式来处理这种情况.
请,除了我的要求之外,绝对不要提及任何其他内容.我已经搜索了足够多,一半以上的答案是关于复杂的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]
Run Code Online (Sandbox Code Playgroud)
编辑
Birei的答案足以从一开始.我最终烹饪这个正则表达式,完美处理我的情况:
my @arglist = $3 =~ m/(?:(?<=")[^"]*(?=(?:\s*"\s*,|\s*"\s*$)))|(?<=,)(?:[^",]*(?=(?:\s*,|\s*$)))|(?<=^)(?:[^",]+(?=(?:\s*,|\s*$)))|(?<=^)(?:[^",]*(?=(?:\s*,)))/g;
Run Code Online (Sandbox Code Playgroud)
它看起来很乱,但它完全符合我的需要.它将引用的列表与comas匹配并返回它们而没有引号,存在一些可能存在的空args的问题,这个正则表达式很杂乱,因为它只是处理这些情况并避免了可变长度lookbehind的错误在perl regex中实现.
我没有得到:所有这些downvotes的原因是什么,我受到一些perl大师的攻击,他们认为我不知道我需要什么以及我要求什么?!我有一些工具可以进行一些asm预处理,我只需要处理一些情况.而已.感谢帮助.
单程:
内容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;
Run Code Online (Sandbox Code Playgroud)
运行它像:
perl script.pl
Run Code Online (Sandbox Code Playgroud)
结果如下:
2
16
"d4,d6"
"d20,d22"
[0]
Run Code Online (Sandbox Code Playgroud)
你说除了之外你不想做任何事情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";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4259 次 |
| 最近记录: |