我有一个具有以下格式的文件,其中每个name = value对用空格分隔。记录由换行符分隔。
value1=1 value2="This is a string" value3=40 value4="Yes"
Perl将上面的字符串解析为name = value对的最简单方法是什么?我尝试了一些方法,但它们都失败了,value2在相关值中有一些空格。
在Perl中有很多涉及CSV解析的东西,但这似乎略有不同。
答案 0 :(得分: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\"",
}
答案 1 :(得分:1)
您可以使用此模式:
([^\s=]++)=(?|"((?>[^"]++|"")*)"|(\S+))
使用分支重置功能(?|...|...)
时,该值始终位于第2组。
答案 2 :(得分: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
)