Regex 用一个正则表达式可以吗?
我有一根像Regex 用一个正则表达式可以吗?,regex,Regex,我有一根像 {! texthere } 我想捕获{!之后的所有内容,直到结束或到达第一个}。所以如果我有 {!这里发短信}{!这里又发短信}{!这里发短信。哦,孩子 我想要[“{!这里发短信}”、“{!这里又发短信}”、“{!这里发短信。哦,天哪!”] 我想这会管用的 {.*} 但是上面的字符串应该是[“{!这里是文本}{!这里又是文本}{!这里是更多的文本。哦,孩子!”] 我仍然对正则表达式缺乏经验,所以我不明白为什么这样做不起作用。我认为它会匹配“{!”后跟任意数量的字符,直到你找到一个可
{! texthere }
我想捕获{!之后的所有内容,直到结束或到达第一个}。所以如果我有
{!这里发短信}{!这里又发短信}{!这里发短信。哦,孩子
我想要[“{!这里发短信}”、“{!这里又发短信}”、“{!这里发短信。哦,天哪!”]
我想这会管用的
{.*}
但是上面的字符串应该是[“{!这里是文本}{!这里又是文本}{!这里是更多的文本。哦,孩子!”]
我仍然对正则表达式缺乏经验,所以我不明白为什么这样做不起作用。我认为它会匹配“{!”后跟任意数量的字符,直到你找到一个可能不存在的括号(非贪婪)。我相信你想使用一个不情愿的量词:
{!.*?}?
这将导致
在找到后面的第一个}
而不是最后一个后立即停止匹配
我有一个关于贪婪和不情愿的量词的问题,这个问题有一个很好的答案
另一个选项是指定允许出现在两个大括号之间的字符,如下所示:
{![^}]*}?
这指定模式中不能有匹配的右大括号。使用
(?如果您的工具/语言支持perl正则表达式,请尝试以下操作:
(?<={!)[^}]*
(?您可以这样做:
({![^}]+}?)
然后恢复与第一组括号相对应的捕获组$1
使用这种方式,您必须使用“match all”类型的函数,因为regex本身是用来匹配单个组函数的
这种方法不使用任何查找。另外,使用^}
应该限制正则表达式引擎循环的数量,因为它正在搜索下一个}
作为一个破坏者,而不是必须先完成整个表达式然后再回溯。最简单的适应方法是使用非贪婪的Kleene star,通常表示为*?
。您使用的正则表达式语言有可用的吗?不是所有的都有。@Nolonar,实际上不确定。我只是复制了他们使用并添加的正则表达式*
的不情愿的修饰符。在我问题中的示例字符串上,我只得到了3个匹配的{!我相信??
是一个Perl构造,意思是“匹配0或1次,而不是贪婪地匹配”。??
有一个特殊的含义,我记不起根据最后的??
它是什么“零次或一次匹配上一个元素,但要尽可能少地匹配”,尽管我不明白他为什么希望匹配包含{!
而不是}
啊,太棒了!我试着在某个时候做一个消极的前瞻,但我想我需要仔细阅读一下周围的东西并真正理解它们。这就是我需要的。我会尽快把它标记为一个答案!@user1652427你不想在{!
?从问题中,他还想要分隔符:我想要[“{!这里有文本],“{!这里又有文本],“{!这里有更多的文本。哦,天哪!”]
({![^}]+}?)