Regex 用一个正则表达式可以吗?

Regex 用一个正则表达式可以吗?,regex,Regex,我有一根像 {! texthere } 我想捕获{!之后的所有内容,直到结束或到达第一个}。所以如果我有 {!这里发短信}{!这里又发短信}{!这里发短信。哦,孩子 我想要[“{!这里发短信}”、“{!这里又发短信}”、“{!这里发短信。哦,天哪!”] 我想这会管用的 {.*} 但是上面的字符串应该是[“{!这里是文本}{!这里又是文本}{!这里是更多的文本。哦,孩子!”] 我仍然对正则表达式缺乏经验,所以我不明白为什么这样做不起作用。我认为它会匹配“{!”后跟任意数量的字符,直到你找到一个可

我有一根像

{! texthere }
我想捕获{!之后的所有内容,直到结束或到达第一个}。所以如果我有

{!这里发短信}{!这里又发短信}{!这里发短信。哦,孩子

我想要[“{!这里发短信}”、“{!这里又发短信}”、“{!这里发短信。哦,天哪!”]

我想这会管用的

{.*}

但是上面的字符串应该是[“{!这里是文本}{!这里又是文本}{!这里是更多的文本。哦,孩子!”]


我仍然对正则表达式缺乏经验,所以我不明白为什么这样做不起作用。我认为它会匹配“{!”后跟任意数量的字符,直到你找到一个可能不存在的括号(非贪婪)。

我相信你想使用一个不情愿的量词:

{!.*?}?
这将导致
在找到后面的第一个
}
而不是最后一个后立即停止匹配

我有一个关于贪婪和不情愿的量词的问题,这个问题有一个很好的答案

另一个选项是指定允许出现在两个大括号之间的字符,如下所示:

{![^}]*}?

这指定模式中不能有匹配的右大括号。

使用
(?如果您的工具/语言支持perl正则表达式,请尝试以下操作:

(?<={!)[^}]*

(?您可以这样做:

({![^}]+}?)

然后恢复与第一组括号相对应的捕获组
$1

使用这种方式,您必须使用“match all”类型的函数,因为regex本身是用来匹配单个组函数的


这种方法不使用任何查找。另外,使用
^}
应该限制正则表达式引擎循环的数量,因为它正在搜索下一个
}
作为一个破坏者,而不是必须先完成整个表达式然后再回溯。

最简单的适应方法是使用非贪婪的Kleene star,通常表示为
*?
。您使用的正则表达式语言有可用的吗?不是所有的都有。@Nolonar,实际上不确定。我只是复制了他们使用并添加的正则表达式
*
的不情愿的修饰符。在我问题中的示例字符串上,我只得到了3个匹配的{!我相信
??
是一个Perl构造,意思是“匹配0或1次,而不是贪婪地匹配”。
??
有一个特殊的含义,我记不起根据最后的
??
它是什么“零次或一次匹配上一个元素,但要尽可能少地匹配”,尽管我不明白他为什么希望匹配包含
{!
而不是
}
啊,太棒了!我试着在某个时候做一个消极的前瞻,但我想我需要仔细阅读一下周围的东西并真正理解它们。这就是我需要的。我会尽快把它标记为一个答案!@user1652427你不想在
{!
?从问题中,他还想要分隔符:
我想要[“{!这里有文本],“{!这里又有文本],“{!这里有更多的文本。哦,天哪!”]
({![^}]+}?)