0

置換に使用している .NET Regex があり、それを更新したいと考えています。

string rxp = "(?<link>{link name=\"(?<name>[^\"]*)\" url=\"(?<url>[^\"]*)\"})";
input = Regex.Replace(input, rxp, "<a target=\"_blank\" href=\"$3\">$2</a>", RegexOptions.IgnoreCase);

この正規表現は、それを正常にキャプチャ{link name="Link 2" url="http://www.google.com"}して に変換し<a target=\"_blank\" href="\http://www.google.com\">Link 2</a>ます。

ただし、引用符が&quot;. つまり{link name=&quot;Link 2&quot; url=&quot;http://www.google.com&quot;}、これを元の出力でレンダリングしたいのです。

現在、(?<link>{link name=[\"|<&quot;>](?<name>[^\"]*)[\"|<&quot;>] url=[\"|<&quot;>](?<url>[^\"]*)[\"|<&quot;>]})一致するものがありますが、 を返します<a target=\"_blank\" href="\quot;http://www.google.com&quot\">quot;Link 2&quot</a>

私の人生では、返される&quot;and<name>値に含めない方法を見つけることができません。<url>

4

2 に答える 2

1

(?: ... )インナーinを使用する必要はまったくありません(?:\"|(?:&quot;))。次のように使用します。

(?:\"|&quot;)

"ただし、 と の両方にリンクがないことを確認するために、&quot;実際に引用符をキャプチャして、次のように使用できます。

(?<link>{link name=(\"|&quot;)(?<name>(?:(?!\2).)*)\2 url=(\"|&quot;)(?<url>(?:(?!\4).)*)\4})

正規表現101のデモ

基本的に、\2は 2 番目のキャプチャへの後方参照 ( または のいずれ"かになります&quot;) であり、 のみではなく、と引用符内での[^\"]の一致を防ぐこともできます。リンクでも同じことが起こります。&quot;(?:(?!\2).)*

名前と URL の両方で引用符が常に同じであることがわかっている場合は、2 番目の引用符のキャプチャを削除できます。

(?<link>{link name=(\"|&quot;)(?<name>(?:(?!\2).)*)\2 url=\2(?<url>(?:(?!\2).)*)\2})
于 2013-10-15T07:55:35.370 に答える