正则表达式匹配{asdf}但不匹配{{asdf}}

GWR*_*GWR 5 regex vbscript

我有一个非常直截了当的问题.

我正在使用此正则表达式来匹配实例{somestring}.

\{{1}(\w+?)\}{1}
Run Code Online (Sandbox Code Playgroud)

问题是,我需要它忽略的情况下{{somestring}},当然,这是相匹配的内部{somestring}{{somestring}}.

知道如何调整表达式以跳过任何类似的东西{{somestring}}吗?

我正在使用vbscript的正则表达式引擎.

Mar*_*der 5

如果您的正则表达式引擎支持外观,那么它们是可行的方法:

(?<!\{)\{\w+\}(?!\})
Run Code Online (Sandbox Code Playgroud)

这确实是你想要的.lookbehind声称{你的前面没有{,而前瞻断言没有}跟随你}.

请注意,{1}它绝不会做任何事情.永远.

另请注意,您不需要制作\w+不合适的,因为它}无论如何都不会消耗.

最后,我只想把它放在这里,是替代逃逸{}是把它变成一个字符的字符类.这是一个你喜欢的味道问题,但我更喜欢这个更好的可读性:

(?<![{])[{]\w+[}](?![}])
Run Code Online (Sandbox Code Playgroud)

编辑:

看起来VBScript不支持lookbehinds.

这有点问题.你能得到的最接近的是:

(^|[^{])[{]\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并追加}.