如何使用正则表达式匹配后面没有...的元素?

时间:2011-05-27 12:53:14

标签: regex

我该如何匹配此字符串?

${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}

6 个答案:

答案 0 :(得分:3)

你可以使用像这样的负面看法确保这样的标准

\$\{(.*)(?<!\d)\}

您可以在Regexr上在线查看。

您的字符串位于第1组。

否定前瞻确保它仅匹配前面没有数字的}

答案 1 :(得分:1)

这适用于您的测试用例,但如果您想要更好的通用正则表达式,则需要更清楚地了解需要捕获的数据如何变化

正则表达式:

/\${(.*[^0-9])}/

在Javascript中:

alert( "${test {0}}".match( /\${(.*[^0-9])}/ )[1] )

答案 2 :(得分:0)

(编辑跟进你的例子......)像这样:

/\$\{((?:.+?|\{\d+\})+?)\}/

期待庞大的回溯,但是......

答案 3 :(得分:0)

(?<={)([^{}]*({\d+})*[^{}]*)+(?=})

已经使用RAD Software Regular Expression Designer进行了测试。此正则表达式适用于.NET和Java环境..

您应该将此正则表达式用于Javascript ..

{([^{}]*({\d+})*[^{}]*)+}

答案 4 :(得分:0)

如何:/\$\{(.*)\}/

这是一个使用给定示例完成工作的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}

答案 5 :(得分:0)

不确定哪种语言需要使用此解决方案,但以下内容适用于PHP:

$arr = array('${test {0}}', '${any string}', '${string - {x}', '${{0} a}', '${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}"