解析名称值对的正则表达式

19

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

AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters"
3个回答

34
  • 无法逃避:

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

  • /((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/
    
    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
    
    您需要通过删除任何转义字符和引号来清理键/值,编辑:添加转义替代方案。编辑2:添加另一种转义替代方案。


这适用于我的简单场景!不过,如果它支持通过转义引用符(双引号("")或反斜杠("))来包含值,那就更好了。 - Chris Karcher
你能帮我一下吗?我需要类似但更像JSON的东西。http://stackoverflow.com/questions/6099891/json-text-split-reg-expression-or-parser - Val
正则表达式是什么,用于 key=value&key=value 的格式,其中 key 或 value 可以为空,key 和 value 可以是任何东西。 - virsha
@virsha 如果您需要询问其他问题,请添加新问题 - Markus Jarderot

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是否被准确地定义的问题。


0
这是我如果使用Perl 5.10会这样做。
qr/
  (?<key>
    (?:
      [^=,\\]
    |
      (?&escape)
    )++ # Prevent null keys
  )
\s*+ = \s*+
(?<value> (?&quoted) | (?: [^=,\s\\] | (?&escape) )++ # Prevent null value ( use quotes for that ) )
(?(DEFINE) (?<escape>\\.) (?<quoted> " (?: (?&escaped) | [^"\\] )*+ " ) ) /x

可以通过%+访问这些元素。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接