正则表达式惰性修改器匹配过多

时间:2018-09-09 23:11:56

标签: regex

以下正则表达式正在跳跃 [url] 标签...

正则表达式 (通用正则表达式)

(?:\[url.*?\])(.*?youtu.*?)(?:\[\/url\])

字符串:

[url]blahyoutubeblah[/url] heyya [url]blahblah[/url]    [url]www.youtube.com/blah[/url]

帮助!

enter image description here

4 个答案:

答案 0 :(得分:2)

您捕获的组中需要youtu,因此子字符串

[url]blahblah[/url]    [url]www.youtube.com/blah[/url]

匹配,因为它以[url]开头,包括youtu,以[/url]结尾。

仅使用否定的字符集(不包括[)可能是不够的,因为这将不允许嵌套标记匹配,例如输入

[url]foobar youtube[b]BOLD TEXT[/b][/url]

在每个重复字符之前,您可能需要对[/url]进行负前瞻:

(?:(?!\[\/url\]).)*

另外,请确保在[url之后出现的所有东西在包含真]之前不包含],并带有:

\[url[^]]*\]

完整:

\[url[^]]*\]((?:(?!\[\/url\]).)*youtu(?:(?!\[\/url\]).)*)\[\/url\]

由于前瞻性较差,因此不再需要使量词变得懒惰。

演示:

https://regex101.com/r/hSAJEp/1

答案 1 :(得分:1)

您要匹配.*,这意味着它将匹配url,直到youtu,然后找到/url

一个简单的解决方法可能是类似的,这意味着它在找到[之前不会与youtu开头的括号匹配

(?:\[url.*?\])([^\[]*?youtu.*?)(?:\[\/url\])

答案 2 :(得分:1)

这很懒,但是如果可以的话,它仍然会匹配-如果可能的话,它不会向左移动。还有其他事情可以做到。其中之一只是为了防止正则表达式本身发生不必要的匹配-只需使用

(?:\[url[^\]]*?\])([^\[]*?youtu.*?)(?:\[\/url\])

答案 3 :(得分:1)

问题是您的正则表达式中有youtu,但是blahblah之间有url要匹配,因此很通用 所以

(?:\[url.*?\])(.*?)(?:\[\/url\])