如何在Perl中将此行解析为name = value对

时间:2014-02-26 00:53:28

标签: regex perl

我有一个具有以下格式的文件,其中每个name = value对用空格分隔。记录由换行符分隔。

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

Perl将上面的字符串解析为name = value对的最简单方法是什么?我尝试了一些方法,但它们都失败了,value2在相关值中有一些空格。

在Perl中有很多涉及CSV解析的东西,但这似乎略有不同。

3 个答案:

答案 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
)