簡體   English   中英

為什么“$ 1”會在我的Regex.Replace()結果中結束?

[英]Why is “$1” ending up in my Regex.Replace() result?

我正在嘗試編寫正則表達式來重寫URL以指向代理服務器。

bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr);

這個表達式的想法很簡單,基本上找到“src ='/”或“src ='//”的實例,並在那一點插入一個PROXY url。 這通常有效但偶爾我會發現文字“$ 1”最終會出現在結果字符串中的情況。

這對我沒有意義,因為如果沒有匹配,那為什么它會取代任何東西呢?

不幸的是我不能給出一個簡單的例子,到目前為止它只發生在非常大的字符串上,但是我想在概念上知道什么可以使這種事情發生。

順便說一句,我嘗試使用正面lookbehind重寫此表達式,如下所示:

bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr);

但如果輸入字符串包含“src ='//”,則最終會在輸出中使用proxyStr TWICE。 這對我來說也沒有多大意義,因為我認為“src =”必須在輸入中出現兩次才能讓proxyStr在輸出中結束兩次。

proxyStr = "10.15.15.15:8008/proxy?url=http://" ,替換字符串變為"$110.15.15.15:8008/proxy?url=http://" 它包含對組號110的引用,當然不存在。

您需要確保代理字符串不以數字開頭。 在你的情況下,你可以通過不捕獲最后一個斜杠,並將替換字符串更改為"$1/"+proxyStr ,如下所示:

bodystring = Regex.Replace(bodystring, "(src='/*)/", "$1/" + proxyStr);

編輯:

Rawling 指出 .NET的regexp庫解決了這個問題:你可以在花括號中包含1以避免錯誤的別名,如下所示:

bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr);

你做的不能做。 像這樣插入變量時,.NET有問題。 您的問題是您的代理字符串以數字開頭: proxyStr = "10.15.15.15:8008/proxy?url=http://"

當你將它與你的$1結合起來時,正則表達式必須尋找不存在的后向引用$110

看看我的意思。

您可以通過匹配其他內容,或通過手動匹配和構建替換字符串等來解決此問題。使用最適合您的方法。

根據dasblinkenlights答案(已經+1)解決方案是這樣的:

bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr);

這可確保使用組1,而不是構建新的組編號。

在第二個版本中,我猜proxyStr出現兩次,因為你再次插入它。 嘗試

string s2 = Regex.Replace(s, "((?<=src='/+))", proxyStr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM