5

我有一个非常直接的问题。

我正在使用这个正则表达式来匹配{somestring}.

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

问题是我需要它来忽略 的实例{{somestring}},但当然,它与内部{somestring}的 in匹配{{somestring}}

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

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

4

3 回答 3

5

如果您的正则表达式引擎支持lookarounds,那么它们就是要走的路:

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

这确实是你想要的。向后看断言没有{在你的前面{,而向前看断言没有}在你的后面}

请注意,{1}它永远不会做任何事情。曾经。

另请注意,您不需要不\w+贪心,因为它无论如何都不能消耗}

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

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

编辑:

似乎 VBScript 不支持lookbehinds。

这有点问题。你能得到的最接近的是:

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

但是,如果在字符串的开头没有找到匹配,这将在匹配中包含前面的字符。这本身不是问题,因为您可以通过捕获子字符串函数或其他东西来摆脱该字符。但是,匹配不能重叠,因此如果您有这样的输入,{some}{string}您将不会轻易获得两个匹配(因为第一个}必须是第二个匹配的一部分)。一些引擎提供\G了作为持续匹配的等价物^,但 VBScript 似乎也不支持。因此,从这里开始它会变得丑陋。

您可以做的是}从比赛中排除收盘(使用另一个前瞻):

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

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

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

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

于 2012-12-09T14:59:33.127 回答
3

这个表达式完美地工作:

^{{1}(\w+?)}{1}$ 
于 2015-12-24T03:31:52.540 回答
0

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

于 2012-12-09T15:17:20.913 回答