我有一个非常直截了当的问题。
我正在使用此正则表达式来匹配{somestring}
的实例。
\{{1}(\w+?)\}{1}
问题在于我需要忽略{{somestring}}
的实例,但当然,它与{somestring}
中的内部{{somestring}}
匹配。
知道如何调整表达式以跳过{{somestring}}
之类的内容吗?
我正在使用vbscript的正则表达式引擎。
答案 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
。如果您希望最后一个字符串与正则表达式匹配,则前一个答案正是您所需要的。