正则表达式匹配整个单词

时间:2013-09-05 16:28:08

标签: regex

我在stackoverflow上看到很多关于使用Regex进行全字匹配的示例。 我有以下情况,我想用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);

以上工作正常。但是当我改变

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

它仍在将www.abc.com替换为www.xyz.com,我不想取代它。

3 个答案:

答案 0 :(得分:1)

\b将匹配字边界,因此任何从单词字符([a-zA-Z0-9_])到非单词字符的转换。

因为如果/跟随你的整个单词听起来你不想匹配,你将需要一个不同的边界检查。以下内容应该有效:

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

如果单词前面的字符不是空格,或者单词后面的字符不是空格,则会导致匹配失败。请注意,我在此处使用了负向lo​​okbehind / lookahead而不是(?<=\s)(?=\s),因此如果您的单词位于字符串的开头或结尾,您仍然会匹配。

答案 1 :(得分:1)

您似乎只希望在替换字符串周围只有空格或开头/结尾。

使用像(^|\s)string to replace(\s|$)这样的东西。不确定你使用的语言可能需要稍微调整一下这个字符串。

答案 2 :(得分: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(?!/)

然后我猜你对'整个单词'的定义是只匹配主域名的链接。