代码之家  ›  专栏  ›  技术社区  ›  roryf

仅当http://不存在时,Regex才与www.example.com匹配

  •  2
  • roryf  · 技术社区  · 15 年前

    我有以下不起作用的正则表达式。我想匹配字符串“www.example.com”,但不匹配字符串' http://www.example.com "(或"anythingwww.example.com"):

    /\bwww\.\w.\w/ig
    

    这在JavaScript中使用如下:

    text = text.replace(/\bwww\.\w.\w/ig, 'http://$&');
    

    我知道正则表达式的第二部分也不能正常工作,但让我困惑的是http://部分。它当前将匹配' http://www.example.com '导致输出' http://htpp://www.example.com

    5 回复  |  直到 15 年前
        1
  •  4
  •   molf    15 年前

    您正在搜索以下事件的发生: www.example.com 用更大的绳子?也许你可以更具体地说明你想要匹配的是什么,但类似的东西可能适合你:

    text = text.replace(/(\s)(www\.\w+\.\w+)/ig, "$1http://$2");
    

    问题在于 \b (匹配单词边界)是指它也匹配 http:// www 因为 / 不是一个单词字符。

        2
  •  3
  •   Matthew Flaschen    15 年前

    这是你想要的吗?锚定确保文本以www开头。但显然,这将在其他子域中失败。

    text = text.replace(/^www\.\w+\.\w+$/ig, "http://$&");
    

    编辑:由于Chris Lutz的评论而修复。我之前做过测试,但一系列奇怪的错误(缺少锚、未替换的点等)让它看起来很有效。我应该重申,无论如何,这是脆弱的。

        3
  •  2
  •   Ben Blank    15 年前

    也许是这样的?

    text = text.replace(/(^|\s)(www(?:\.\w+){2,})/ig, "$1http://$2");
    

    这将与以下网址相匹配:

    • " www.example.com “—>” http://www.example.com "
    • " Visit www.example.com “—>” Visit http://www.exmaple.com "
    • " Visit www.example.co.uk Visit http://www.example.co.uk "

    但不是:

    • " "
    • " ftp.example.com
    • " www.com "
        4
  •  0
  •   lothar    15 年前

    你可以使用 ^ 指示器(锚定),要求文本匹配以 :

    echo -e "http://www.example.com\nanythingwww.example.com\nwww.example.com" | grep "^www.example.com"
    www.example.com
    
        5
  •  0
  •   JP Alioto    15 年前

    您可以使用否定的lookback断言。类似于。。。

    (?<!http\:\/\/)(?:www.example.com)