2009-07-15 25 views
-2

我正在處理重寫URL的ASP.NET響應過濾器,以在特定情況下指向不同的域。在正則表達式中幫助消極lookbehind

因爲ASP.NET將響應寫入塊,所以在頁面完全流式傳輸之前,我的過濾器會被調用多次。這意味着我需要小心,每次調用Regex.Replace都不會雙重替換一個url(最終以http://foo.comhttp://foo.com/path結尾)。

要做到這一點,我試圖使用的替代負回顧後的表情,但似乎並不奏效:

content = Regex.Replace(content,"((?<!" + newDomain + ")" + match + ")", newDomain + match); 

這將創建像一個正則表達式:

((?<!http://www.foo.com/)actual/url) 

但是,它似乎不尊重後面的外觀,我得到一切雙倍取代。

任何想法?

編輯:當我使用像正則表達式教練這樣的工具對樣本數據進行測試時,這個正則表達式很有效。編輯2:添加了斜槓,它實際上存在。

+0

到底在哪不 「匹配」 變量從何而來?更確切地說,你是通過解析內容中的URL來獲得它們的嗎?在該行之前的「匹配」是什麼樣的? – mercator 2009-07-15 22:16:40

+0

你想要替換域名或路徑嗎?正如你聲稱你在正則表達式教練中獲得了你期望的比賽,但是你沒有得到你期望的替換動作。 – 2009-07-15 22:33:27

回答

1

一對夫婦的想法:

  • 你需要躲避。在正則表達式?我不知道<!語法,也沒有我的書,所以這可能是一個有爭議的問題。
  • 我不明白它會如何匹配http://www.foo.com/something,因爲您的示例中沒有/在www.foo.com之後。

希望其中的一些幫助。

0

我會嘗試這個

content = Regex.Replace(content,"(?<!" + newDomain + ")^[^/]+/(?=" + match + ")", newDomain + match); 

這將匹配(從而替換表達域部分)僅是域不NEWDOMAIN和路徑匹配。

0

也許我失去了一些東西,但你應該使用負lookbehinds呢?從本質上來看,後視並不會匹配任何東西。而您希望匹配域和路徑,然後替換域。對?

所以應該更多的東西是這樣的:

Regex.Replace("http://www.foo.com/something", "(http://www.foo.com/)(something)", "http://www.abc.com/$2") 

的想法是使用分組你的優勢。這就是$ 2部分將抓取比賽後半部分(路徑)並將其追加到新域的地方。我在Regex Hero(一個.NET正則表達式測試器)中測試了它,並且它工作正常。順便說一下,正則表達式教練是基於Perl的,與.NET正則表達式引擎相比,您可能會遇到一些不同。

2

我會嘗試第三個角度。

我想你混淆了這個事實你的正則表達式「匹配」正則表達式中的一些教練,與它匹配你想要的部分。因此,您對替換結果感到驚訝。

替換掉換所有匹配的爲新令牌輸入。

負向後視確保圖案不存在,但該圖案不是匹配輸入的一部分。

您得到的結果是因爲只有您的URL的路徑(您的匹配字符串)是匹配輸入並且您將用newDomain變量替換它。

這就是爲什麼你正在得到你得到的結果。

0

只有在字符串中找不到要替換的域部分時才替換它的想法如何?

即,濫用Perl作爲速記:

if ($string !~ /foo\.com) { 
    $string = $domain . $string; 
}