我正试图建立一个“超级非贪婪”的正则表达式,因为缺少一个更好的短语。我遇到的问题如下:
https://regex101.com/r/wuwOGd/2
正则表达式:\/\*\*(.*?)\*\/\w+\d+
示例字符串:/**word1*/asdf /**word2*/abc123
我想要它做什么:只匹配第二个令牌,以便我可以提取word2
。
它正在做什么:匹配word1*/asdf /**word2
这在技术上是正确的,所以我不能责怪正则表达式做我告诉它要做的事情。但是,有一种方法可以让正则表达式“失败”,只要它必须扩展到第一个*/
之外吗?
我在这种特殊情况下使用python来匹配附加到具有特定签名的函数的注释块。
编辑:
正如下面所指出的,事实证明我所寻找的神奇词语是“脾气暴躁的”,而非“超级”!
答案 0 :(得分:2)
您可以使用否定类而不是非贪婪重复:
\/\*\*([^*]*)\*\/\w+\d+
https://regex101.com/r/wuwOGd/3
因为您查找的令牌与*
分隔,所以非常安全。
答案 1 :(得分:2)
/\*{2}((?:(?!\*/).)*)\*/\w+\d+
或者,不必捕获它(假设PCRE)。 See regex in use here
/\*{2}\K(?:(?!\*/).)*(?=\*/\w+\d+)
此方法使用tempered greedy token来确保它匹配任何字符,除非找到*/
。