正则表达式超级非贪婪

时间:2018-02-08 16:11:07

标签: python regex

我正试图建立一个“超级非贪婪”的正则表达式,因为缺少一个更好的短语。我遇到的问题如下:

https://regex101.com/r/wuwOGd/2

正则表达式:\/\*\*(.*?)\*\/\w+\d+ 示例字符串:/**word1*/asdf /**word2*/abc123

我想要它做什么:只匹配第二个令牌,以便我可以提取word2

它正在做什么:匹配word1*/asdf /**word2这在技术上是正确的,所以我不能责怪正则表达式做我告诉它要做的事情。但是,有一种方法可以让正则表达式“失败”,只要它必须扩展到第一个*/之外吗?

我在这种特殊情况下使用python来匹配附加到具有特定签名的函数的注释块。

编辑:

正如下面所指出的,事实证明我所寻找的神奇词语是“脾气暴躁的”,而非“超级”!

2 个答案:

答案 0 :(得分:2)

您可以使用否定类而不是非贪婪重复: \/\*\*([^*]*)\*\/\w+\d+ https://regex101.com/r/wuwOGd/3

因为您查找的令牌与*分隔,所以非常安全。

答案 1 :(得分:2)

See regex in use here

/\*{2}((?:(?!\*/).)*)\*/\w+\d+

或者,不必捕获它(假设PCRE)。 See regex in use here

/\*{2}\K(?:(?!\*/).)*(?=\*/\w+\d+)

此方法使用tempered greedy token来确保它匹配任何字符,除非找到*/