我正在尋求解決分裂其中包含下列格式的文本字符串:除非是單引號字符串,否則我怎樣才能用空格分隔字符串?
"abcd efgh 'ijklm no pqrs' tuv"
這將產生以下結果:
['abcd', 'efgh', 'ijklm no pqrs', 'tuv']
換句話說,它分裂的空白,除非在一個單引號字符串中。我認爲這可以通過使用「Lookaround」運算符的.NET正則表達式來完成,特別是平衡運算符。我不太瞭解Perl。
我正在尋求解決分裂其中包含下列格式的文本字符串:除非是單引號字符串,否則我怎樣才能用空格分隔字符串?
"abcd efgh 'ijklm no pqrs' tuv"
這將產生以下結果:
['abcd', 'efgh', 'ijklm no pqrs', 'tuv']
換句話說,它分裂的空白,除非在一個單引號字符串中。我認爲這可以通過使用「Lookaround」運算符的.NET正則表達式來完成,特別是平衡運算符。我不太瞭解Perl。
#!/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
的源代碼,看看使用的模式。
所以你決定使用正則表達式?現在你有兩個問題。
請允許我推斷一下。您需要任意數量的字段,其中一個字段由不包含空格的文本組成,或者用空格分隔,並以引號開頭並以引號結尾(可能帶有空格)。
換句話說,你想要做一個命令行shell。你真的應該重用一些東西。如果做不到這一點,你應該在一個時間捕捉領域,以正則表達式是這樣的:
^ *([^ ]+|'[^']*')(.*)
在那裏你追加一組到您的列表,並繼續與組2
A的內容循環單通過正則表達式將無法捕獲任意數量的字段。你可能能夠在正則表達式上分割(python會做到這一點,不知道perl),但由於你匹配空間外的東西,我不確定這甚至是一個選項。
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;
我愛怎麼「我該怎麼做?」我曾經有過關於Perl的問題已經很快得到了回答,「使用這個模塊完全符合你的要求。」 – jergason 2010-03-17 03:40:03
數字有一個包完成我所需要的包。我不確定我在找什麼。你是搖滾明星,謝謝! – Kivin 2010-03-17 04:24:02
@Jergason把這歸咎於那些精彩的人,他們*如果不能確切地找到他們需要的東西,並且必須自己寫出來,那麼CPAN會在結果之後。 :) – hobbs 2010-03-17 04:36:23