【问题标题】:How can you parse this line into name=value pairs in Perl如何在 Perl 中将此行解析为 name=value 对
【发布时间】:2014-02-26 00:53:28
【问题描述】:

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

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

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

在 Perl 中有很多关于 CSV 解析的内容,但这似乎略有不同。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    大概是这样的吧?

    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\"",
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用这个模式:

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

      使用分支重置功能(?|...|...),该值始终位于第 2 组中。

      【讨论】:

        【解决方案3】:

        如果您需要一个正则表达式来执行此操作并验证数据,您可以尝试这个应该考虑转义的:

        \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
        )             
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-20
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-15
          相关资源
          最近更新 更多