正则表达式匹配{asdf}但不匹配{{asdf}}

时间:2012-12-09 14:54:43

标签: regex vbscript

我有一个非常直截了当的问题。

我正在使用此正则表达式来匹配{somestring}的实例。

\{{1}(\w+?)\}{1}

问题在于我需要忽略{{somestring}}的实例,但当然,它与{somestring}中的内部{{somestring}}匹配。

知道如何调整表达式以跳过{{somestring}}之类的内容吗?

我正在使用vbscript的正则表达式引擎。

3 个答案:

答案 0 :(得分:5)

如果您的正则表达式引擎支持lookarounds,则可以使用它们:

(?<!\{)\{\w+\}(?!\})

这确实是你想要的。 lookbehind断言{前面没有{,并且前瞻断言你的}后面没有}

请注意,{1}绝不会做任何事情。如初。

另请注意,您不需要\w+取消{,1},因为无论如何它都不会消耗}

最后,我只想把它放在这里,转义{}的替代方法是将它放入一个单字符的字符类中。这是一个你喜欢的品味问题,但我更喜欢这个的可读性:

(?<![{])[{]\w+[}](?![}])

修改

It seems like VBScript does not support lookbehinds.

这是一个问题。你能得到的最接近的是:

(^|[^{])[{]\w+[}](?![}])

但是,如果在字符串的开头找不到匹配项,则会在匹配项中包含前一个字符。仅此一点不是问题,因为您可以通过捕获子字符串函数或其他东西来消除该字符。但是,匹配不能重叠,因此如果您有{some}{string}之类的输入,则不会轻易获得两个匹配(因为第一个}必须是第二个匹配的一部分)。对于继续匹配,某些引擎提供\G相当于^,但VBScript似乎也不支持。因此,从现在开始它会变得丑陋。

你可以做的是从匹配中排除结束}(使用另一个前瞻):

(^|[^{])[{]\w+(?=[}](?![}]))

现在您将获得匹配{some}{string,因此必须将所有匹配与}追加,并从每个不在字符串开头的匹配项中删除第一个字符。或者,如果您可以获取捕获的结果,则可以使用

(^|[^{])([{]\w+)(?=[}](?![}]))

然后检索捕获组2并附加}

答案 1 :(得分:3)

此表达式完美无缺:

^{{1}(\w+?)}{1}$ 

答案 2 :(得分:0)

在这种特殊情况下,您可以使用 ^ {{1}(\ w +?)} {1} $ - 这将匹配{something},但赢了不匹配{{something}},但它也不匹配something else and {something} after that。如果您希望最后一个字符串与正则表达式匹配,则前一个答案正是您所需要的。