0

我在 stackoverflow 上看到了很多关于使用 Regex 进行全词匹配的示例。我有以下情况,我想将 www.abc.com 替换为 www.xyz.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,我不想替换它。

4

3 回答 3

1

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

由于听起来您不想匹配/整个单词,因此您将需要进行不同的边界检查。像下面这样的东西应该可以工作:

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

如果单词前面的字符不是空格,或者单词后面的字符不是空格,这将导致匹配失败。请注意,我在这里使用了否定的lookbehind/lookahead,而不是(?<=\s)and,(?=\s)因此如果您的单词位于字符串的开头或结尾,您仍然会匹配。

于 2013-09-05T16:36:05.893 回答
1

您似乎只想在替换的字符串周围有空格或行首/行尾。

使用类似(^|\s)string to replace(\s|$). 不确定您使用的是什么语言,您可能需要稍微调整一下这个字符串。

于 2013-09-05T16:39:11.863 回答
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(?!/)

那么我猜您对“整个单词”的定义是仅匹配主域名的链接。

于 2013-09-05T16:50:10.247 回答