我有一个非常简单的问题。
我使用这个正则表达式来匹配{somestring}的实例。
\{{1}(\w+?)\}{1}问题是我需要它来忽略{{somestring}}的实例,当然,它与{{somestring}}中的内部{somestring}匹配。
您知道如何调整表达式以跳过{{somestring}}之类的内容吗
我使用的是vbscript的正则表达式引擎。
发布于 2012-12-09 22:59:33
如果你的正则表达式引擎支持lookarounds,它们就是最好的选择:
(?<!\{)\{\w+\}(?!\})这就是你想要的。后视断言{之前没有{,前视断言}后面没有}。
请注意,{1}从不执行任何操作。永远不会。
还要注意,您不需要让\w+变得不贪婪,因为它无论如何都不能使用}。
最后,我只想在这里指出,转义{和}的另一种方法是将其放入一个单字符的类中。这是一个你喜欢哪一个的口味问题,但我更喜欢这个的可读性:
(?<![{])[{]\w+[}](?![}])编辑:
It seems like VBScript does not support lookbehinds.
这是一个小问题。你能得到的最接近的东西是:
(^|[^{])[{]\w+[}](?![}])但是,如果在字符串开头找不到匹配项,则会在匹配项中包括前面的字符。这本身并不是问题,因为您可以通过捕获子字符串函数或其他方法来删除该字符。但是,匹配不能重叠,所以如果您有一个像{some}{string}这样的输入,您不会轻易获得两个匹配(因为第一个}必须是第二个匹配的一部分)。一些引擎提供\G作为^的等价物,用于连续匹配,但VBScript似乎也不支持这一点。因此,从现在开始,它将变得丑陋。
您可以做的是从匹配中排除结束的} (使用另一个前视):
(^|[^{])[{]\w+(?=[}](?![}]))现在,您将获得匹配的{some和}{string,因此必须在每个匹配后附加},并从每个不在字符串开头的匹配中删除第一个字符。或者,如果您可以获得捕获的结果,则可以使用
(^|[^{])([{]\w+)(?=[}](?![}]))然后取回捕获组2并追加}。
发布于 2015-12-24 11:31:53
这个表达式可以完美地工作:
^{{1}(\w+?)}{1}$ 发布于 2012-12-09 23:17:21
在这种情况下,你可以使用^{{1}(\w+?)}{1}$ -它将匹配{something},但不匹配{{something}},但它也不匹配something else and {something} after that。如果您希望最后一个字符串与您的正则表达式匹配,那么前面的答案就是您所需要的。
https://stackoverflow.com/questions/13788523
复制相似问题