【问题标题】:Regular expression for parsing name value pairs用于解析名称值对的正则表达式
【发布时间】:2008-10-03 18:17:11
【问题描述】:

有人可以提供一个正则表达式来解析字符串中的名称/值对吗?这些对由逗号分隔,并且可以选择将值括在引号中。例如:

AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters"

【问题讨论】:

    标签: regex


    【解决方案1】:
    • 没有逃脱:

      /([^=,]*)=("[^"]*"|[^,"]*)/
      
    • 键和值的双引号转义:

      /((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/
      
      key=value,"key with "" in it"="value with "" in it",key=value" "with" "spaces
      
    • 反斜杠字符串转义:

      /([^=,]*)=("(?:\\.|[^"\\]+)*"|[^,"]*)/
      
      key=value,key="value",key="val\"ue"
      
    • 完整的反斜杠转义:

      /((?:\\.|[^=,]+)*)=("(?:\\.|[^"\\]+)*"|(?:\\.|[^,"\\]+)*)/
      
      key=value,key="value",key="val\"ue",ke\,y=val\,ue
      

    编辑:添加了转义选项。

    Edit2:添加了另一个转义选项。

    您必须通过删除所有转义字符和周围的引号来清理键/值。

    【讨论】:

    • 这适用于我的简单场景!不过,通过转义它来支持在值中包含引号可能会很好,无论是双引号 ("") 还是使用反斜杠 (\")
    • 你能帮帮我吗?我需要类似但更像 json stackoverflow.com/questions/6099891/… 的东西
    • key=value&key=value 的正则表达式是什么,key 或 value 可以为 null,key 和 value 可以是任何东西
    • @virsha 请add a new question如果您要求不同的东西。
    【解决方案2】:

    来自 MizardX 的好回答。小问题 - 它不允许名称等周围有空格(这可能无关紧要),它收集引号以及引用的值(这也可能无关紧要),并且它没有用于嵌入的转义机制引用值中的双引号字符(再一次,这可能无关紧要)。

    正如所写,该模式适用于大多数扩展的正则表达式系统。解决这些问题可能需要使用 Perl。这个版本使用双引号来转义——因此 a="a""b" 会生成一个字段值 'a""b' (这并不完美,但之后可以很容易地修复):

    /\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/
    

    此外,您必须使用 2 美元或 3 美元来收集价值,而使用 MizardX 的答案,您只需使用 2 美元。所以,它并不容易或好,但它涵盖了一些边缘情况。如果更简单的答案就足够了,请使用它。

    测试脚本:

    #!/bin/perl -w
    
    use strict;
    my $qr = qr/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/;
    
    while (<>)
    {
        while (m/$qr/)
        {
            print "1= $1, 2 = $2, 3 = $3\n";
            $_ =~ s/$qr//;
        }
    }
    

    这意味着 $2 或 $3 未定义 - 准确地说。

    【讨论】:

      【解决方案3】:

      如果你可以使用Perl 5.10,我会这样做。

      qr/ (? (?: [^=,\\] | (?&逃脱) )++ # 防止空键 ) \s** = \s** (? (?&引) | (?: [^=,\s\\] | (?&逃脱) )++ # 防止空值(为此使用引号) ) (?(定义) (?\\.) (? " (?: (?&转义) | [^"\\] )*+ " ) ) /X

      元素将通过%+访问。

      perlretut 在创建这个答案时非常有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 2012-07-19
        • 1970-01-01
        • 2021-09-10
        • 2011-06-28
        • 2021-09-09
        相关资源
        最近更新 更多