2013-09-05 143 views
1

我看到很多關於使用正則表達式的整個單詞匹配的stackoverflow示例。 我有以下情況,我想用www.xyz.com取代www.abc.com。正則表達式來匹配整個單詞

string RetVal = "I am going to visit www.abc.com"; 
string TextToFind = @"\bwww.abc.com\b"; 
string TextToReplace = "www.xyz.com"; 
bool IgnoreCase = true; 
RegexOptions regOpt = RegexOptions.None; 
if (IgnoreCase) 
    regOpt = RegexOptions.IgnoreCase; 
RetVal = Regex.Replace(RetVal, TextToFind,TextToReplace, regOpt); 

上述工作fine.But當我改變

RetVal = "I am going to visit www.abc.com/xyz.html"; 

它仍然是更換www.abc.com到www.xyz.com,我不希望替換。

回答

0

\b將匹配單詞邊界,所以任何從單詞字符([a-zA-Z0-9_])到非單詞字符的轉換。

既然聽起來像你不想匹配,如果/跟隨你的整個單詞,你將需要一個不同的邊界檢查。像下面這樣的東西應該工作:

string TextToFind = @"(?<!\S)www.abc.com(?!\S)"; 

這將導致比賽失敗,如果你的字之前的字符不是空格,或者如果你的字後的字符不是空白。請注意,我在此處使用了負向lo​​okbehind/lookahead而不是(?<=\s)(?=\s),這樣,如果您的單詞位於字符串的開頭或末尾,您仍然可以匹配。

0

您似乎只想在被替換的字符串周圍只有空格或開頭/行尾。

使用類似於(^|\s)string to replace(\s|$)的東西。不確定你使用的語言可能需要稍微調整一下這個字符串。

0

\b是一個字邊界,並會匹配一側的「字」字那裏的(一個字字符這裏是指符合\w字符),並在另一側的非文字字符(即它匹配\W)。

如果你的整個字的定義是「這在以前和之後有一個空間,除非它是在開頭或字符串的結尾」,那麼你可以使用正則表達式:

(?<!\S)www.abc.com(?!\S) 

要完全檢查。

但是,您會在這些字符串中處理www.abc.com嗎?

I'm going to visit www.abc.com; there's lots of things there. 
What's this 'www.abc.com' you're speaking about? 

如果你仍然認爲那些爲「整個單詞」,那麼也許最好只檢查主域名(即有www.abc.com後沒有斜槓):

\bwww.abc.com\b(?!/) 

然後我猜測'全字'的定義是與主域名匹配的鏈接。

+0

謝謝傑瑞。 \ bwww.abc.com \ b(?!/)將解決我的問題 – user2751458

+0

@ user2751458不客氣:) – Jerry