我在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,我不想取代它。
答案 0 :(得分:1)
\b
将匹配字边界,因此任何从单词字符([a-zA-Z0-9_]
)到非单词字符的转换。
因为如果/
跟随你的整个单词听起来你不想匹配,你将需要一个不同的边界检查。以下内容应该有效:
string TextToFind = @"(?<!\S)www.abc.com(?!\S)";
如果单词前面的字符不是空格,或者单词后面的字符不是空格,则会导致匹配失败。请注意,我在此处使用了负向lookbehind / 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(?!/)
然后我猜你对'整个单词'的定义是只匹配主域名的链接。