问题描述
|
如何匹配此字符串?
${test {0}}
我需要匹配${
和}
之间的所有内容,其中}
前面没有数字,因此我可以检索test {0}
。
是否可以单独使用正则表达式模式进行匹配?
样品:
${any string} == any string
${string - {x} == string - {x
${{0} a} == {0} a
${a {1} b {3} c {2} d {0}} == a {1} b {3} c {2} d {0}
解决方法
您可以使用这样的负面眼神来确保这样的标准
\\$\\{(.*)(?<!\\d)\\}
您可以在Regexr上在线查看它。
您的字符串在组1中。
否定的前瞻确保它仅与不带数字的}
匹配。
, 这适用于您的测试用例,但是如果您想要更好的常规正则表达式,则需要更清楚地了解需要捕获的数据如何变化
正则表达式:
/\\${(.*[^0-9])}/
用Javascript:
alert( \"${test {0}}\".match( /\\${(.*[^0-9])}/ )[1] )
, (按照您的示例进行编辑……)像这样:
/\\$\\{((?:.+?|\\{\\d+\\})+?)\\}/
期待巨大的回溯,尽管...
, :11ѭ
这是一个使用给定示例完成工作的perl脚本:
#!/usr/bin/perl
use Modern::Perl;
my @l = (\'${any string}\',\'${string - {x}\',\'${{0} a}\',\'${a {1} b {3} c {2} d {0}}\');
my $re = qr/\\$\\{(.*)\\}/;
foreach(@l) {
say $1 if $_ =~ $re;
}
输出:
any string
string - {x
{0} a
a {1} b {3} c {2} d {0}
, 不知道您需要哪种语言的解决方案,但是以下内容在PHP中对我有效:
$arr = array(\'${test {0}}\',\'${any string}\',\'${a {1} b {3} c {2} d {0}}\');
foreach ($arr as $s) {
if (preg_match(\'~\\$\\{(.+?[^\\d])}~\',$s,$m ) > 0)
var_dump($s . \' == \' . $m[1]);
}
输出值
string(23) \"${test {0}} == test {0}\"
string(27) \"${any string} == any string\"
string(29) \"${string - {x} == string - {x\"
string(17) \"${{0} a} == {0} a\"
string(53) \"${a {1} b {3} c {2} d {0}} == a {1} b {3} c {2} d {0}\"
, (?<={)([^{}]*({\\d+})*[^{}]*)+(?=})
它已通过RAD软件正则表达式设计器进行了测试。此正则表达式适用于.NET和Java环境。
您应该将此正则表达式用于Javascript。
{([^{}]*({\\d+})*[^{}]*)+}