有人可以提供一个正则表达式,从字符串中解析名称/值对吗?这些对由逗号分隔,值可以选择用引号括起来。例如:
AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters"
有人可以提供一个正则表达式,从字符串中解析名称/值对吗?这些对由逗号分隔,值可以选择用引号括起来。例如:
AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters"
无法逃避:
/([^=,]*)=("[^"]*"|[^,"]*)/
双引号转义用于键和值:
/((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/
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:添加另一种转义替代方案。/\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是否被准确地定义的问题。
Perl 5.10
会这样做。
qr/ (?<key> (?: [^=,\\] | (?&escape) )++ # Prevent null keys )
\s*+ = \s*+
(?<value> (?"ed) | (?: [^=,\s\\] | (?&escape) )++ # Prevent null value ( use quotes for that ) )
(?(DEFINE) (?<escape>\\.) (?<quoted> " (?: (?&escaped) | [^"\\] )*+ " ) ) /x
可以通过%+
访问这些元素。
perlretut
对创建这个答案非常有帮助。