リンクタグのhrefプロパティの引用符の間に格納されているアイテムと一致するように、以下のRegExパターンを変更しようとしています。
私の条件は次のとおりです。
- httpで始まる任意のURLにすることができます
- $$を含むものと一致してはなりません
私の現在の正規表現:
var pattern = @"(?<name>href)=""(?<value>http[^""]*)""";
どんな助けでもいただければ幸いです。
次の式を試してください。
(?i)href\s*=\s*"http://(?>((?<InvalidUrlChars>[$]{2})|[^"])*?")(?(InvalidUrlChars)(?!))
編集:上記のパターンのより詳細な説明:
(?i)-これはインライン正規表現オプションです。式で大文字と小文字を区別しないように設定します。(「http」が「HTTP」と一致するように)
(?> ...)-これはアトミックグループ化構造です。それは基本的に、グループによって一致するものはすべて一致しないことはできないと言っています。正規表現は、一致するものを取得できるかどうかを確認するために、さまざまなパスを試行します。たとえば、「$$」を含む一致を削除するために使用した構成は、このグループ化構成がないと回避されます。
(?...)-名前付きグループ。
[^"]-引用符ではない任意の文字に一致します。
(... | ...)-代替のグループ化構造。正規表現は、パイプ( "|")の前のパターンを使用して一致を見つけようとします。一致しない場合は、パイプに続くパターンで再試行します。
?-これは貪欲ではない一致です。通常の" "を使用すると、正規表現は可能な限り一致しようとします。「*?」可能な限り一致させようとします。与えられた記号のセット間でテキストを一致させようとする場合、わずかに効率的で役立ちます。
(?(InvalidUrlChars)... | ...)-if/elseグループ化構造。この特定の構文を使用すると、名前付きグループ( "(InvalidUrlChars)")が一致した場合、パイプの前にある式が一致します。それ以外の場合、パイプに続く式は一致します。「else」の部分はオプションです(私はそれを使用しませんでした)。
(?!)-否定的な先読みアサーション。ルックアラウンドアサーションを説明するのに十分なスペースがありませんが、この式は常に失敗すると言えば十分です。
したがって、要約すると、この式は任意のURLに一致しますが、URLに二重ドル記号( "$$")が含まれている場合、InvalidUrlCharsグループは「一致」としてトリガーされます。式の最後で、InvalidUrlCharsグループが一致した場合、一致全体が失敗し、アトミックグループは、正規表現が戻ってドル記号を非引用符として扱うことを防ぎます。
詳細については、 http://msdn.microsoft.com/en-us/library/az24scfcを参照してください。
次の文字列を比較します。
<a href="http://test.com"/>
<a href="http://test.com" alt="test"/>
<a alt="$$" href="http://test.com"/>
<a HREF="HTTP://test.com"/>
<a href=http://test.com />
<a href="https://test.com"/>
<a href="ftp://test.com"/>
<a href="test.com"/>
<a href="http://test$$.com"/>
<a href="http://////invalid*&^%$#@!;"/>
以下が一致します:
href="http://test.com"
href="http://test.com"
href="http://test.com"
HREF="HTTP://test.com"
href="http://////invalid*&^%$#@!;"
編集:HTMLの処理はHTMLパーサーを使用して行うのが最適であることに心から同意します。正規表現はそれでひどいです。ただし、迅速な解決策が必要で、時折発生する癖をあまり気にしない場合は、正規表現が適しています。