Regex 如何使用正则表达式来匹配后面没有…的元素。。。?

Regex 如何使用正则表达式来匹配后面没有…的元素。。。?,regex,Regex,我怎样才能匹配这个字符串 ${test {0}} 我需要匹配${和}之间的所有内容,其中}前面没有数字,因此我可以检索测试{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

我怎样才能匹配这个字符串

${test {0}}
我需要匹配
${
}
之间的所有内容,其中
}
前面没有数字,因此我可以检索
测试{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}
(根据您的示例进行编辑…)如下所示:

尽管如此,预计会出现巨大的回溯…

(根据您的示例进行编辑…)如下所示:


尽管这对您的测试用例有效,但您需要更清楚地了解,如果您想要一个更好的通用正则表达式,您需要捕获的数据可能会发生怎样的变化

正则表达式:

/\${(.*[^0-9])}/
在Javascript中:

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

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

正则表达式:

/\${(.*[^0-9])}/
在Javascript中:

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

您可以使用像这样的负面观察来确保这样的标准

\$\{(.*)(?<!\d)\}
\$\{(.*)(?
你可以在网上看到它

您的字符串在组1中


负前瞻确保它只在前面没有数字的
}
上匹配。

您可以使用像这样的负前瞻确保这样的条件

\$\{(.*)(?<!\d)\}
(?<={)([^{}]*({\d+})*[^{}]*)+(?=})
\$\{(.*)(?
你可以在网上看到它

您的字符串在组1中

负前瞻确保它只在前面没有数字的
}
上匹配。

怎么样:
/\$\{(.*)}/

(?<={)([^{}]*({\d+})*[^{}]*)+(?=})
下面是一个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}
怎么样:
/\$\{(.*)\}/

下面是一个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}', '${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]);
}
输出
不确定您需要使用哪种语言的解决方案,但以下内容在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]);
}
输出

请用匹配和不匹配数据的例子来解释,什么是所需的编程语言?为什么示例2要匹配任何东西?这毫无意义…@Xaerxess c#。但我只需要一个模式,而不是一个处理匹配的代码。请用匹配和不匹配数据的例子来解释,什么是所需的编程语言?为什么示例#2是否应该匹配任何内容?这毫无意义…@Xaerxess c#。但是我想要一个单独的模式,而不是一个处理匹配的代码。这为什么被否决了?正则表达式是否有问题?我投了更高的票,但它有一个缺陷,当内部字符串以一个数字结尾时失败。
${test a1}
是的,我想我的问题过于直截了当,而不是试图理解基于他后来添加的样本,intentRegex是无效的。不,它与所有样本字符串匹配,与他在问题中提出的相同。为什么投票被否决?正则表达式是否有问题?我投了赞成票,但它有一个缺陷,当内部字符串以失败的数字结尾。
${test a1}
是的,我想我的问题过于字面化,而不是试图理解intentRegex根据他后来添加的样本是无效的。不,它不是,它与所有样本字符串匹配,与他在问题中提出的相同。它有一个缺陷。如果内部字符串以数字结尾,则它不匹配(
${a1}
)。但我能处理。谢谢你的回答,对我来说似乎效果很好,可读性也很好。@Bruno:我认为你可以像这样修复这个缺陷:
\$\{(.*)(?它有一个缺陷。如果内部字符串以一个数字结尾,它就不匹配(
${a1}
)。但我能处理。谢谢你的回答,对我来说似乎效果很好,可读性也很好。@Bruno:我想你可以像这样修复这个缺陷:
\$\{(.*)(?