【发布时间】:2008-10-03 18:17:11
【问题描述】:
有人可以提供一个正则表达式来解析字符串中的名称/值对吗?这些对由逗号分隔,并且可以选择将值括在引号中。例如:
AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters"
【问题讨论】:
标签: regex
有人可以提供一个正则表达式来解析字符串中的名称/值对吗?这些对由逗号分隔,并且可以选择将值括在引号中。例如:
AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters"
【问题讨论】:
标签: regex
没有逃脱:
/([^=,]*)=("[^"]*"|[^,"]*)/
键和值的双引号转义:
/((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/
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:添加了另一个转义选项。
您必须通过删除所有转义字符和周围的引号来清理键/值。
【讨论】:
来自 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 未定义 - 准确地说。
【讨论】:
如果你可以使用Perl 5.10,我会这样做。
元素将通过%+访问。
perlretut 在创建这个答案时非常有帮助。
【讨论】: