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