我有一個文件,其格式如下,其中每個名稱=值對由空格分隔。記錄由換行符分隔。如何在Perl中將此行解析爲名稱=值對
value1=1 value2="This is a string" value3=40 value4="Yes"
在Perl中解析上面的字符串到它的名稱=值對最簡單的方法是什麼?我嘗試了一些方法,但是它們都失敗了,而value2在相關值中有一些空格。
在Perl中有很多涵蓋CSV解析的內容,但是這似乎有點不同。
我有一個文件,其格式如下,其中每個名稱=值對由空格分隔。記錄由換行符分隔。如何在Perl中將此行解析爲名稱=值對
value1=1 value2="This is a string" value3=40 value4="Yes"
在Perl中解析上面的字符串到它的名稱=值對最簡單的方法是什麼?我嘗試了一些方法,但是它們都失敗了,而value2在相關值中有一些空格。
在Perl中有很多涵蓋CSV解析的內容,但是這似乎有點不同。
也許這樣的事情?
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\"",
}
如果你需要一個正則表達式來做到這一點,一種驗證數據,你可以試試這個一說應占逃脫:
\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
)
可以使用此圖案:
([^\s=]++)=(?|"((?>[^"]++|"")*)"|(\S+))
與分支復位特徵(?|...|...)
的值總是在組2
[文本:: CSV](HTTPS:/ /metacpan.org/pod/Text::CSV)'sep_char' – toolic