首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配{asdf}但不匹配{{asdf}}的正则表达式

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

Stack Overflow用户
提问于 2012-12-09 22:54:43
回答 3查看 280关注 0票数 5

我有一个非常简单的问题。

我使用这个正则表达式来匹配{somestring}的实例。

代码语言:javascript
复制
\{{1}(\w+?)\}{1}

问题是我需要它来忽略{{somestring}}的实例,当然,它与{{somestring}}中的内部{somestring}匹配。

您知道如何调整表达式以跳过{{somestring}}之类的内容吗

我使用的是vbscript的正则表达式引擎。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-09 22:59:33

如果你的正则表达式引擎支持lookarounds,它们就是最好的选择:

代码语言:javascript
复制
(?<!\{)\{\w+\}(?!\})

这就是你想要的。后视断言{之前没有{,前视断言}后面没有}

请注意,{1}从不执行任何操作。永远不会。

还要注意,您不需要让\w+变得不贪婪,因为它无论如何都不能使用}

最后,我只想在这里指出,转义{}的另一种方法是将其放入一个单字符的类中。这是一个你喜欢哪一个的口味问题,但我更喜欢这个的可读性:

代码语言:javascript
复制
(?<![{])[{]\w+[}](?![}])

编辑:

It seems like VBScript does not support lookbehinds.

这是一个小问题。你能得到的最接近的东西是:

代码语言:javascript
复制
(^|[^{])[{]\w+[}](?![}])

但是,如果在字符串开头找不到匹配项,则会在匹配项中包括前面的字符。这本身并不是问题,因为您可以通过捕获子字符串函数或其他方法来删除该字符。但是,匹配不能重叠,所以如果您有一个像{some}{string}这样的输入,您不会轻易获得两个匹配(因为第一个}必须是第二个匹配的一部分)。一些引擎提供\G作为^的等价物,用于连续匹配,但VBScript似乎也不支持这一点。因此,从现在开始,它将变得丑陋。

您可以做的是从匹配中排除结束的} (使用另一个前视):

代码语言:javascript
复制
(^|[^{])[{]\w+(?=[}](?![}]))

现在,您将获得匹配的{some}{string,因此必须在每个匹配后附加},并从每个不在字符串开头的匹配中删除第一个字符。或者,如果您可以获得捕获的结果,则可以使用

代码语言:javascript
复制
(^|[^{])([{]\w+)(?=[}](?![}]))

然后取回捕获组2并追加}

票数 5
EN

Stack Overflow用户

发布于 2015-12-24 11:31:53

这个表达式可以完美地工作:

代码语言:javascript
复制
^{{1}(\w+?)}{1}$ 
票数 3
EN

Stack Overflow用户

发布于 2012-12-09 23:17:21

在这种情况下,你可以使用^{{1}(\w+?)}{1}$ -它将匹配{something},但不匹配{{something}},但它也不匹配something else and {something} after that。如果您希望最后一个字符串与您的正则表达式匹配,那么前面的答案就是您所需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13788523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档