2

私は正規表現の専門家ではありませんが、数時間後にこの正規表現を構築しました。

#\[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]

今、私は同様のチェックを追加しようとして\[url.*?\]\[url=ます\[/url\]。私は多くの方法を試しましたが、100% 機能する方法を見つけることができるようです。

最初に、正規表現に既に存在するものと非常によく似た別の否定的な先読みを追加しようとしましたが、これは部分的に機能しますが、行の終わりまで、つまり最後まで先読みが通過するように見えます\[/url\]-各試合で、先読みが必要でした\[/url\]キャプチャ グループが行うように、最初に停止します。

デバッグ用の文字列は次のとおりです。

[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\]それを怠惰にする/修正する方法はありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

2

私は以下がうまくいくはずだと思います:

\[url=(?:(?!<div onclick="unveil_spoiler"|\[url.*?\].*?\[/url.*?\]).)*?([^_\W]+?://[^\[\]]*)\]((?:(?!\[/?url).)*)\[/url\]

http://rubular.com/r/7h9EJ0casb

于 2012-04-19T04:42:54.663 に答える
1

これは機能しますか?

\[url=[^\[<]*?\](?:(?!(\[url)|<).)*?\[\/url\]

http://regexr.com?30mna

于 2012-04-19T04:08:43.843 に答える