我有一个非常直截了当的问题.
我正在使用此正则表达式来匹配实例{somestring}.
\{{1}(\w+?)\}{1}
Run Code Online (Sandbox Code Playgroud)
问题是,我需要它忽略的情况下{{somestring}},当然,这是相匹配的内部{somestring}在{{somestring}}.
知道如何调整表达式以跳过任何类似的东西{{somestring}}吗?
我正在使用vbscript的正则表达式引擎.
(?<!\{)\{\w+\}(?!\})
Run Code Online (Sandbox Code Playgroud)
这确实是你想要的.lookbehind声称{你的前面没有{,而前瞻断言没有}跟随你}.
请注意,{1}它绝不会做任何事情.永远.
另请注意,您不需要制作\w+不合适的,因为它}无论如何都不会消耗.
最后,我只想把它放在这里,是替代逃逸{并}是把它变成一个字符的字符类.这是一个你喜欢的味道问题,但我更喜欢这个更好的可读性:
(?<![{])[{]\w+[}](?![}])
Run Code Online (Sandbox Code Playgroud)
编辑:
这有点问题.你能得到的最接近的是:
(^|[^{])[{]\w+[}](?![}])
Run Code Online (Sandbox Code Playgroud)
但是,如果在字符串的开头找不到匹配,则将包括匹配中的前一个字符.仅此一点不是问题,因为您可以通过捕获子字符串函数或其他东西来摆脱该角色.但是,匹配不能重叠,所以如果你有一个输入,{some}{string}你就不会轻易得到两个匹配(因为第一个}必须是第二个匹配的一部分).有些引擎提供\G了相同的^连续匹配,但VBScript似乎也不支持.因此,从这里开始会变得丑陋.
你可以做的是}从匹配中排除结束(使用另一个前瞻):
(^|[^{])[{]\w+(?=[}](?![}]))
Run Code Online (Sandbox Code Playgroud)
现在,您将得到匹配{some和}{string,因此将不得不追加每一场比赛与}和每场比赛,是不是在你的字符串的开头删除第一个字符.或者,如果您可以掌握捕获的结果,则可以使用
(^|[^{])([{]\w+)(?=[}](?![}]))
Run Code Online (Sandbox Code Playgroud)
然后检索捕获组2并追加}.