2014-02-26 32 views
2

我有一個文件,其格式如下,其中每個名稱=值對由空格分隔。記錄由換行符分隔。如何在Perl中將此行解析爲名稱=值對

value1=1 value2="This is a string" value3=40 value4="Yes" 

在Perl中解析上面的字符串到它的名稱=值對最簡單的方法是什麼?我嘗試了一些方法,但是它們都失敗了,而value2在相關值中有一些空格。

在Perl中有很多涵蓋CSV解析的內容,但是這似乎有點不同。

+1

[文本:: CSV](HTTPS:/ /metacpan.org/pod/Text::CSV)'sep_char' – toolic

回答

3

也許這樣的事情?

use strict; 
use warnings; 

my $s = 'value1=1 value2="This is a string" value3=40 value4="Yes"'; 

my %pairs = $s =~/(\S+) \s* = \s* ([^\s"]+ | "[^"]*") /gx; 

use Data::Dump; 
dd \%pairs; 

輸出

{ 
    value1 => 1, 
    value2 => "\"This is a string\"", 
    value3 => 40, 
    value4 => "\"Yes\"", 
} 
0

如果你需要一個正則表達式來做到這一點,一種驗證數據,你可以試試這個一說應占逃脫:

\w+=(?:'.*?(?<!\\)'|".*?(?<!\\)"|\w+) 

演示:http://regex101.com/r/wK0eD2

說明

\w+=    # [0-9_a-zA-Z]+= 
(?:    # non-capturing group 
    '.*?   # single quote and everything until... 
    (?<!\\)'  # first single quote not preceded by antislash 
|    # OR 
    ".*?   # double quote and everything until... 
    (?<!\\)"  # first double quote not preceded by antislash 
|    # OR 
    \w+   # string of alphanum characters 
)    
1

可以使用此圖案:

([^\s=]++)=(?|"((?>[^"]++|"")*)"|(\S+)) 

與分支復位特徵(?|...|...)的值總是在組2

相關問題