我正在寻找一种解决方法来拆分包含以下格式的文本的字符串:
"abcd efgh 'ijklm no pqrs' tuv"
将产生以下结果:
['abcd', 'efgh', 'ijklm no pqrs', 'tuv']
换句话说,除非在单个带引号的字符串中,否则它将按空格分割。我认为可以使用.NET regexps使用“Lookaround”运算符,特别是平衡运算符。我对Perl不太确定。
答案 0 :(得分:15)
#!/usr/bin/perl
use strict; use warnings;
use Text::ParseWords;
my @words = parse_line('\s+', 0, "abcd efgh 'ijklm no pqrs' tuv");
use Data::Dumper;
print Dumper \@words;
输出:
C:\Temp> ff $VAR1 = [ 'abcd', 'efgh', 'ijklm no pqrs', 'tuv' ];
您可以查看Text::ParseWords::parse_line
的源代码以查看使用的模式。
答案 1 :(得分:3)
use strict; use warnings;
my $text = "abcd efgh 'ijklm no pqrs' tuv 'xwyz 1234 9999' 'blah'";
my @out;
my @parts = split /'/, $text;
for ( my $i = 1; $i < $#parts; $i += 2 ) {
push @out, split( /\s+/, $parts[$i - 1] ), $parts[$i];
}
push @out, $parts[-1];
use Data::Dumper;
print Dumper \@out;
答案 2 :(得分:2)
所以你决定使用正则表达式?现在你有两个问题。
请允许我推断一下。您需要任意数量的字段,其中字段由不包含空格的文本组成,或者由空格分隔并以引号开头并以引号结尾(可能在中间有空格)。
换句话说,您希望执行命令行shell所执行的操作。你真的应该重用一些东西。如果不这样做,你应该一次捕获一个字段,使用正则表达式:
^ *([^ ]+|'[^']*')(.*)
将第一组附加到列表中的位置,并继续使用第2组的内容循环。
单次通过正则表达式将无法捕获任意大量的字段。你可能能够拆分正则表达式(python会这样做,不确定perl),但由于你匹配空间之外的东西,我不确定这是否是一个选项。