URL を検索し、現在 URL に /MyPathSegment/ が含まれていないことを主張し、同じプロパティ (href または src) と同じ End-Of-URL に置き換えますが、途中にパス セグメントを配置します。 :
(?<tag>(?:href|src)=")(?(?=/MyPathSegment/)(?!)|/?(?<url>[^"]*"))
と置換する:
${tag}/MyPathSegment/${url}
VB.Net では:
Dim strPathPrefix As String = "/MyPathSegment/"
Dim strTest As String = Regex.Replace("<a href=""/controller/action"" property=""something"">Hello World</a>", "(?<tag>(?:href|src)="")(?(?=" & strPathPrefix & ")(?!))/?(?<url>[^""]*"")", "${tag}/MyPathSegment/${url}")
strTest = <a href="/MyPathSegment/controller/action" property="something">Hello World</a>
VB では、引用符を二重にする必要があることに注意してください。
これを使えば、現在スラッシュを持っているかどうかは関係ありません。strPathPrepend が「/」で終わっていることを確認する必要があります
いくつかのことをテストして、微調整が必要な可能性のあるバンプに遭遇した場合はお知らせください.
(?<tag>...
これに続くデータは、「タグ」という名前のキャプチャ グループにキャプチャする必要があります。
(?:href|src)
「href」または「src」のいずれかに一致します。「?:」は、必ずしも結果をその特定のサブ式にキャプチャするわけではありませんが、結果は親サブ式の「タグ」にキャプチャされます。
=")
等号と引用符を文字通りキャプチャし、「タグ」のキャプチャ グループを閉じます。
(?(...)...|...)
例 条件ステートメント。IF は小さな部分式にあり、THEN は交互の "|" の左側にあり、ELSE は交互の右側にあります。
(?=...)
ルックアラウンドの例。この場合、ルックアラウンドは「ルックアヘッド」です。つまり、現在の位置に続くテキストが何かに等しいかどうかを確認しますが、カーソルを進めません。
(?(?=/MyPathSegment/)...
したがって、2 つの例をまとめると、次のような条件が得られます... もし、href=" を収集した後、/MyPathSegment/ が見つかったら...
(?!)
これは別のルックアラウンドです。否定先読みです。しかし、そこには何もありません。通常は (?!...) です。これは否定先読みであり、空であるため、正規表現ステートメントは自動的に失敗します。パス セグメントが既にそこにあることがわかった場合は、失敗することを望んでいます。
|/?
または、/MyPathSegment/ が見つからない場合...オプションでスラッシュを見つけますが、キャプチャ グループにはありません。
(?<url>...
Else ステートメントでも...オプションのスラッシュの後に、「url」という名前の 2 番目のキャプチャ グループを作成します。
[^"]*"
引用ではないものをすべてキャプチャします...複数回(オプション、何かを必要とする場合は*を+に変更します)、引用ではないすべてをキャッチした後...引用を「url」キャプチャグループにもキャプチャします.
))
最初に URL キャプチャ グループを閉じ、次に条件付きグループを閉じます。