仅当http://不存在时才使用正则表达式来匹配www.example.com

时间:2009-05-14 23:17:22

标签: javascript regex

我有以下正则表达式无效。我想匹配字符串'www.example.com',但不匹配字符串'http://www.example.com'(或'bothwww.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 个答案:

答案 0 :(得分:4)

您是否在较大的字符串中搜索www.example.com的出现位置?也许你可以更具体地说明你想要完全匹配的东西,但是这样的东西可能适合你:

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

\b(与字词边界匹配)的问题在于它也在http://www之间匹配,因为/不是单词字符。

答案 1 :(得分:3)

这样做你想要的吗?锚点确保文本以www开头。但显然这会与其他子域失败。

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

编辑:感谢Chris Lutz的评论。我之前做过测试,但是一个奇怪的错误组合(缺少锚点,非转义点等)使它看起来很有效。我应该重申,无论如何这都是脆弱的。

答案 2 :(得分:2)

也许是这样的?

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

但不是:

  • http://www.example.com
  • ftp.example.com
  • www.com

答案 3 :(得分:0)

您可以使用 ^ 指示符(锚点)要求文本匹配以 www 开头:

echo -e "http://www.example.com\nanythingwww.example.com\nwww.example.com" | grep "^www.example.com"
www.example.com

答案 4 :(得分:0)

你可以使用负面的lookbehind断言。类似......

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

<击>