【问题标题】:Regex to match whole word [duplicate]正则表达式匹配整个单词[重复]
【发布时间】:2013-09-05 16:28:07
【问题描述】:

我在 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,我不想替换它。

【问题讨论】:

    标签: regex


    【解决方案1】:

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

    如果/ 跟在你的整个单词后面,听起来你不想匹配,你将需要一个不同的边界检查。像下面这样的东西应该可以工作:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        \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(?!/)
        

        那我猜你对“整个词”的定义是匹配只包含主域名的链接。

        【讨论】:

        • 谢谢杰瑞。 \bwww.abc.com\b(?!/) 会解决我的问题
        • @user2751458 不客气 :)
        猜你喜欢
        • 2010-11-15
        • 2012-01-06
        • 2011-08-07
        • 2017-07-08
        • 1970-01-01
        相关资源
        最近更新 更多