2014-09-25 83 views
1

我有以下的正则表达式正则表达式开始从以前的比赛最后一个字母匹配

(\{\w*\}\s*[^{}]+\s*)\{? 

,我对这个字符串

this {match} is cool{match} but {match} this one is more cool 

目前我能捕捉2组测试它 - >{match} is cool{match} this one is more cool,所以你可以看到组but {match}缺失。

之所以这样,是因为去年,匹配的是{,所以在接下来的匹配反过来他会跳过{,并不会能够匹配到新{发生。

有没有人知道如何强制匹配中间组?

调试:http://regex101.com/r/hM5xE6/2

+0

你想捕捉'但是{}匹配'或'{}匹配but'?因为如果它是第一个,那么与你捕获的其他模式不同。如果你试图捕获'{match} but',那么它就是相同的模式。 – 2014-09-25 12:28:41

回答

4

你可能只删除\{?(和\s*太);您也不需要捕捉括号:

\{\w*\}[^{}]+ 

测试它live on regex101.com

如果要强制在比赛一{前或在字符串的结尾结束,你可以使用一个positive lookahead assertion

\{\w*\}[^{}]+(?=\{|$) 

但是,你只需要,如果你想避免如果嵌套大括号完全匹配,如{{match} whatever},其中第一个正则表达式会找到{match} whatever

+0

好的第二个解决方案。但我确实认为OP希望获得这些比赛,并且关于比赛预测的解释可以改善您的回答。 – Tensibai 2014-09-25 12:23:23

+0

@Tensibai:“获得比赛”是什么意思?正则表达式获取匹配,它不会(另外)将它们捕获到包含完全相同文本的组中。 – 2014-09-25 12:25:01

+0

我的意思是有捕获组供以后使用,但不知道使用的语言,这是我的一个假设,你是对的。编辑,ooops,起初没有看到regex101的链接,忘记了解释请求:) – Tensibai 2014-09-25 12:27:28

1

您可以使用以下regular expression开始在以前的比赛

\{\w*\}[^{}]+(?=\{|$) 
1

要包括在正则表达式的下一个{(但不是在比赛)从最后一个字母匹配,所以它开始的下一场比赛之后的字符,跳过第一个{并且不匹配,直到达到第二个。

不需要lookahead或类似的东西。 如果去掉后面检查\{?,你会得到所有三场比赛(也可以删除括号中的}最后\s*):

(\{\w*\}\s*[^{]+)

http://regex101.com/r/hM5xE6/7

你也可以使用下面的正则表达式,这取决于你需要具体怎么是与捕获:

(\{\w*\}[\w\s]*)

http://regex101.com/r/hM5xE6/5

相关问题