2013-10-15 78 views
0

我有一個.NET正則表達式,我用於替換,我想更新它。正則表達式去除替換字符

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;在返回的<name><url>值。

回答

1

你不太需要(?:\"|(?:&quot;))使用內(?: ...);並使用它像這樣:

(?:\"|&quot;) 

有些事情,你可能會做,但是,爲了確保有既"&quot;沒有聯繫,實際上你可以捕捉到的報價和使用它像這樣:

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

regex101 demo

基本上,\2是反向引用於第二種捕獲(這將是要麼"&quot;),然後,而不是僅[^\"],你也可以在的引用中阻止&quot;的匹配。鏈接發生同樣的事情。

如果你現在知道了引號,始終是名稱和地址都相同,你可以將報價第二擷取:

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

很不錯的。 +1的在線正則表達式測試器給出了很好的詳細解釋。 – Reuben

+1

唯一需要注意的是.NET以不同的方式處理編號的後向引用。它會首先計算未命名的引用,然後命名引用,所以\ 2實際上需要是\ 1。 – Reuben

+0

@Reuben不客氣!是的,我發現regex101真棒:)哦,我不知道。謝謝,我會牢記在心:) – Jerry

0

一位同事教我關於被動匹配。

而不是[]的一些部分,我應該一直在使用()。然後爲了確保這些零件不會返回,我可以使用(?:)來防止它們作爲替換件返回。

我得到的正則表達式是(?<link>{link name=(?:\"|(?:&quot;))(?<name>[^\"]*)(?:\"|(?:&quot;)) url=(?:\"|(?:&quot;))(?<url>[^\"]*)(?:\"|(?:&quot;))})