2013-09-05 109 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