2010-03-17 16 views
5

我正在尋求解決分裂其中包含下列格式的文本字符串:除非是單引號字符串,否則我怎樣才能用空格分隔字符串?

"abcd efgh 'ijklm no pqrs' tuv" 

這將產生以下結果:

['abcd', 'efgh', 'ijklm no pqrs', 'tuv'] 

換句話說,它分裂的空白,除非在一個單引號字符串中。我認爲這可以通過使用「Lookaround」運算符的.NET正則表達式來完成,特別是平衡運算符。我不太瞭解Perl。

回答

15

使用Text::ParseWords

#!/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

我愛怎麼「我該怎麼做?」我曾經有過關於Perl的問題已經很快得到了回答,「使用這個模塊完全符合你的要求。」 – jergason 2010-03-17 03:40:03

+0

數字有一個包完成我所需要的包。我不確定我在找什麼。你是搖滾明星,謝謝! – Kivin 2010-03-17 04:24:02

+5

@Jergason把這歸咎於那些精彩的人,他們*如果不能確切地找到他們需要的東西,並且必須自己寫出來,那麼CPAN會在結果之後。 :) – hobbs 2010-03-17 04:36:23

2

所以你決定使用正則表達式?現在你有兩個問題。

請允許我推斷一下。您需要任意數量的字段,其中一個字段由不包含空格的文本組成,或者用空格分隔,並以引號開頭並以引號結尾(可能帶有空格)。

換句話說,你想要做一個命令行shell。你真的應該重用一些東西。如果做不到這一點,你應該在一個時間捕捉領域,以正則表達式是這樣的:

^ *([^ ]+|'[^']*')(.*) 

在那裏你追加一組到您的列表,並繼續與組2

A的內容循環單通過正則表達式將無法捕獲任意數量的字段。你可能能夠在正則表達式上分割(python會做到這一點,不知道perl),但由於你匹配空間外的東西,我不確定這甚至是一個選項。

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; 
相關問題