我有一个非常直接的问题。
我正在使用这个正则表达式来匹配{somestring}.
\{{1}(\w+?)\}{1}
问题是我需要它来忽略 的实例{{somestring}},但当然,它与内部{somestring}的 in匹配{{somestring}}。
知道如何调整表达式以跳过类似的内容{{somestring}}吗?
我正在使用 vbscript 的正则表达式引擎。
如果您的正则表达式引擎支持lookarounds,那么它们就是要走的路:
(?<!\{)\{\w+\}(?!\})
这确实是你想要的。向后看断言没有{在你的前面{,而向前看断言没有}在你的后面}。
请注意,{1}它永远不会做任何事情。曾经。
另请注意,您不需要不\w+贪心,因为它无论如何都不能消耗}。
最后,我只想把它放在这里,这是一种替代转义的方法{,}就是把它放到一个单字符的字符类中。您更喜欢哪一个是一个口味问题,但我更喜欢这个的可读性:
(?<![{])[{]\w+[}](?![}])
编辑:
这有点问题。你能得到的最接近的是:
(^|[^{])[{]\w+[}](?![}])
但是,如果在字符串的开头没有找到匹配,这将在匹配中包含前面的字符。这本身不是问题,因为您可以通过捕获子字符串函数或其他东西来摆脱该字符。但是,匹配不能重叠,因此如果您有这样的输入,{some}{string}您将不会轻易获得两个匹配(因为第一个}必须是第二个匹配的一部分)。一些引擎提供\G了作为持续匹配的等价物^,但 VBScript 似乎也不支持。因此,从这里开始它会变得丑陋。
您可以做的是}从比赛中排除收盘(使用另一个前瞻):
(^|[^{])[{]\w+(?=[}](?![}]))
现在您将获得匹配项{someand }{string,因此必须在每个匹配项中附加}并删除不在字符串开头的每个匹配项中的第一个字符。或者,如果您可以获得捕获的结果,您可以使用
(^|[^{])([{]\w+)(?=[}](?![}]))
然后检索捕获组2并附加}。
这个表达式完美地工作:
^{{1}(\w+?)}{1}$
在这种特殊情况下,您可以使用^ {{1}(\w+?)}{1} $ - 这将匹配 {something},但不会匹配 {{something}},但它也不会匹配something else and {something} after that. 如果您希望最后一个字符串与您的正则表达式匹配,那么前面的答案正是您所需要的。