提问人:Fabrício Matté 提问时间:4/19/2012 最后编辑:tchristFabrício Matté 更新时间:8/29/2012 访问量:1219
正则表达式 - 负 lookahead with lazy limit?
Regex - negative lookahead with lazy limit?
问:
我不是正则表达式专家,但几个小时后,我构建了这个正则表达式:
#\[url=(?!.*?<div onclick="unveil_spoiler.*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]#i
哪个不区分大小写:
\[url=(?!.*?<div onclick="unveil_spoiler.*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]
匹配模式,除非它包含介于 和 和 之间的字符串。[url=xxxx://yyyy]zzzz[/url]
<div onclick="unveil_spoiler
[url=
[/url]
现在我正在尝试添加一个类似的检查,如果它包含 和 之间的匹配项,则不返回匹配项。我尝试了很多方法,但我似乎可以找到一个 100% 有效的方法。\[url.*?\]
\[url=
\[/url\]
首先,我尝试添加另一个否定的 lookforward,与我的正则表达式中已经存在的 lookahead 非常相似,它部分起作用,但后来似乎 lookahead 一直持续到行的末尾 - 直到最后 - 对于每场比赛,我希望 lookahead 像捕获组一样在第一个停止。\[/url\]
\[/url\]
下面是用于调试的字符串:Here's a string for debugging:
[url=http://www.match.com]Match[/url][url=http://www.nomatch.com<div onclick="unveil_spoiler"]No match[/url][url=http://www.match.com]Match[/url][url=http://www.nomatch.com]<div onclick="unveil_spoiler" No match[/url]
[url=http://www.nomatch.com]No <div onclick="unveil_spoiler"match[/url][url=http://www.match.com]Match[/url][url=http://www.nomatch.com]No <div onclick="unveil_spoiler" match[/url][url=http://www.match.com]Match[/url]
[url=http://www.match.com]Match[/url][url=http://www.match.com][b]Match[/b][/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url]
[url=http://www.thisshouldntmatch.com[url=http://www.match.com]Match[/url]This shouldn't match[/url]
[url=http://www.thisshouldntmatch.com[url=http://www.thisshouldntmatch.com[url=http://www.match.com]Match[/url]]This shouldn't match[/url]This shouldn't match[/url]
[url=http://www.thisshouldntmatch.com[url=http://www.match.com]Match[/url]This shouldn't match[/url][url=http://www.match.com]Match[/url]
[url=http://www.thisshouldntmatch.com]This shouldn't match[url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][/url]
[url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url]
正则表达式发布在帖子的开头,它将与第一行中的 2 个匹配项完美匹配。现在我希望它在比赛内部时不返回匹配项,我尝试了这个正则表达式:\[url.*?\]
\[url=(?!.*?\[url.*?\].*?\[/url.*?\])(?!.*?<div onclick="unveil_spoiler.*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]
还有这个:
\[url=(?!.*?(?:<div onclick="unveil_spoiler|\[url.*?\]).*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]
当匹配项内部存在匹配项时,它不会返回匹配项,但随后它也会停止匹配它应该匹配的第一行(在示例字符串中)的第一个匹配项(并且与第一个正则表达式一样)。也就是说,它只会匹配每行的最后一个有效匹配项。\[url.*?\]
我认为这是前瞻的问题,它不会在第一时间停止,那么有什么方法可以让它变得懒惰/修复它吗?\[/url\]
任何帮助都是值得赞赏的。
答:
这行得通吗?
\[url=[^\[<]*?\](?:(?!(\[url)|<).)*?\[\/url\]
评论
[url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url]
((\[url=(?!.*?(?:<div onclick="unveil_spoiler|\[url.*?\]).*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\])|(?<=.*?\[url.*?)\[url=.*?url\])
[url=
\[url=[^\[]*?\][^\[]*?\[\/url\]
我明白了,它确实适用于大多数字符串,但是,通过否定它不会匹配或检查,我真的不想阻止[]
[url=http://www.match.com][b]Match[/b][/url]
<div onclick="unveil_spoiler
[]
\[url=.*?\[/url\]
我认为以下方法应该有效:
\[url=(?:(?!<div onclick="unveil_spoiler"|\[url.*?\].*?\[/url.*?\]).)*?([^_\W]+?://[^\[\]]*)\]((?:(?!\[/?url).)*)\[/url\]
http://rubular.com/r/7h9EJ0casb
评论
<div onclick="unveil_spoiler"
[url=http://www.nomatch.com<div onclick="unveil_spoiler"]No match[/url][url=http://www.nomatch.com]<div onclick="unveil_spoiler" No match[/url]
\[url=(?!.*?<div onclick="unveil_spoiler")(?:(?!\[url.*?\].*?\[/url.*?\]).)*?([^_\W]+?://[^\[\]]*)\]((?:(?!\[/?url).)*)\[/url\]
评论