2009-01-27 141 views
2

使用.NET框架,我試圖用單斜槓替換字符串中的雙斜線字符,但它似乎是刪除一個額外的字符,我不知道爲什麼。正則表達式替換幫助

我有一個字符串:

http://localhost:4170/RCRSelfRegistration//Default.aspx 

我的正則表達式是:

[^(://|:\\\\)](\\\\|//|\\/|/\\) 

,返回值是:

http://localhost:4170/RCRSelfRegistratio/Default.aspx 

你可以看到,在RCRSelfRegistration n個已除去。我不知道爲什麼。

/// <summary> 
/// Match on double slashes (//, \\, /\, \/) but do not match :// or :\\ 
/// </summary> 
private const string strMATCH = @"[^(://|:\\\\)](\\\\|//|\\/|/\\)"; 

/// <summary> 
/// Replace double slashes with single slash 
/// </summary> 
/// <param name="strUrl"></param> 
/// <returns></returns> 
public static string GetUrl(string strUrl) 
{ 
    string strNewUrl 
    System.Text.RegularExpressions.Regex rxReplace = 
     new System.Text.RegularExpressions.Regex(strMATCH); 

    strNewUrl = rxReplace.Replace(strUrl, "/"); 

    return strNewUrl; 
} 

回答

4

你的正則表達式的第一部分「[^(:// |:\\)]」匹配任何不是「(:/ | \」的字符(如tomalak指出,negset匹配所有字符它沒有進一步的處理邏輯),其中包括緊接在「//default.aspx」之前的「n」 - 它不是一個零寬度斷言。

你可能想要做的是改變那部分模式到一個零寬度lookbehind,以確保斜槓字符沒有冒號前面

+0

我明白你的意思了。我已將字符串簡化爲「[^:](\\\\ | | // | \\/|/\\)」,但您能告訴我零寬度後視的語法嗎? – Jeremy 2009-01-27 17:46:22

+0

現在遍佈各地。 =) – Instantsoup 2009-01-27 17:47:53

5

[^(://|:\\\\)]不按照您認爲的方式工作。

[]是一個字符範圍 - 它匹配範圍中包含的單個字符。

[^:]將匹配除冒號以外的任何字符。這可能更接近你想要的。

你可能真正想要的是一個zero-width lookbehind assertion(?<!:)

1

的否定部分[^(:// |:\\)]的您正則表達式的N項匹配,從而刪除它。

1

您是否嘗試過使用字符串的替換方法。它不像正則表達式替換優雅,但只要你沒有這樣做在一個循環中數百次巨大的字符串,它應該爲你的purpo服務se:

string myString = oldString.Replace(@"\\", @"\").Replace("//", "/"); 

否則,你可以花費與正則表達式的年齡fidlign。

2

你需要的是背後組負這個樣子的:

(?<!:)(\\\\|//|\\/|/\\) 
0

我想你只需要一個簡單的字符串以循環替換。將所有「//」替換爲「/」。您需要一個可以保存搜索位置的功能,並讓您瀏覽字符串。一旦你到達了字符串的末尾,再做一次,直到你沒有在通行證上進行任何替換。

例如:

///一個// A/A ////

通1

// A/A/A //

通2

/a/a/a/