Regex 正则表达式匹配以字符开头和结尾的字符串

Regex 正则表达式匹配以字符开头和结尾的字符串,regex,eclipse,Regex,Eclipse,我需要一个正则表达式来在eclipse中执行搜索,以匹配以${开头并以}结尾的所有字符串,但这两个字符串之间不应该有pageContext。 比如说 ${requestScope.user} ${sessionScope.user} 应该匹配 但${pageContext.request}不应 经过我的努力,我制作了这个正则表达式,它匹配以${开头的字符串,但有些方法不符合我的要求。如有任何帮助,我们将不胜感激。您可以使用负前瞻排除特定的匹配: \$\{(?!pageContext\.).*?\

我需要一个正则表达式来在eclipse中执行搜索,以匹配以${开头并以}结尾的所有字符串,但这两个字符串之间不应该有pageContext。 比如说

${requestScope.user}

${sessionScope.user}

应该匹配

${pageContext.request}不应


经过我的努力,我制作了这个正则表达式,它匹配以${开头的字符串,但有些方法不符合我的要求。如有任何帮助,我们将不胜感激。

您可以使用负前瞻排除特定的匹配:

\$\{(?!pageContext\.).*?\}
    ^^^^^^^^^^^^^^^^
(?!pageContext\)
前瞻将使所有匹配失败,其中
{
后跟
pageContext.
。此外,您可以使用
[^{}]*
而不是
*?

图案细节

  • \$
    -文字
    $
  • \{
    -文字
    {
  • (?!pageContext\)
    -如果
    pageContext,则匹配失败。
    立即跟随
    {
  • *?
    -除换行符以外的任何0个以上字符(或
    [^{}]*
    -除
    {
    }
    以外的零个或多个字符)
  • \}
    -文字
    }
注意

如果需要避免将任何
${…}
子字符串与
pageContext匹配。
其中的任何位置,请使用

\$\{(?![^{}]*pageContext\.)[^{}]*\}
    ^^^^^^^^^  

在这里,前瞻中的
[^{}]*
将查找
pageContext。
在任何0+字符之后,而不是
{
}

向前看或向后看都是昂贵的。您应该更喜欢可选的匹配技巧:

\$\{(?:.*pageContext.*|(.*))\}


为了避免混淆,让我指定这将匹配任何带有“${”前缀和“}”后缀的字符串,但如果该字符串包含“pageContext”第一个捕获将为空。如果第一个捕获为非空,则有一个字符串与您的条件匹配。

非常感谢它的工作原理,但它正在选择整个字符串,如果我只想选择${和}在上述条件下,整个string@Mckenzie这个正则表达式实际上不匹配任何东西,这意味着无论您运行它,它都会返回匹配的字符串,这取决于正则表达式的使用方式添加捕获可能会做什么,也可能不会做什么,但是您可以通过这样做来捕获匹配:
(\$\{(?!pageContext\).\)
@Mckenzie:虽然可以将
${
后面不跟
pageContext
\$\{(?!pageContext\)
匹配,但不能使用Eclipse正则表达式引擎匹配前面不跟
}
{pageContext.
因为它不支持无限宽度lookbehind.FYI:最快的解决方案是。或者如果
{…}
内部可以有
{
。它也会选择${pageContext.request},但它不会not@Mckenzie正如您从live示例中看到的,它没有捕获“${pageContext.request}”这只会在匹配的情况下捕获。您如何使用此正则表达式的结果?回溯比我的任何锚定前瞻都要昂贵。64步(我的)(或使用否定字符类的30步)与110步(您的)在相同的内容上。@Jonathan它正在捕获它,我正在用Wiktor提供的解决方案pls check测试它works@Mckenzie如果您查看“列表”选项卡,它会显示捕获和相应的输入。需要注意的是,我的每一行都将匹配前缀为“${”和“}”的行后缀,但如果在大括号之间找到“pageContext”,则捕获将为空: