Javascript:需要正则表达式帮助

时间:2012-01-17 21:38:01

标签: javascript regex

说到Regex,我比门钉更笨,所以在制作Firefox扩展时,我向朋友求助,他给了我这个:

if( doc.location.href.match(/(www\.google.*?[?&]q=[^&]+)/i) )

但AMO编辑拒绝它说它太宽泛(例如它会匹配http://uptime.netcraft.com/up/graph?site=www.google.com),有人可以帮助我/给我一个匹配以下的正则表达式(根据编辑器应该匹配基本上这个):http(s)://www.google.tld/q=*

所以例如它应该匹配 http或https(正常和安全)以及谷歌之后的任何tld(如.ru,.se,.fr,.in等)

换句话说,它只应与Google搜索匹配。

提前感谢您的帮助!

/瑞恩

6 个答案:

答案 0 :(得分:2)

^https?://www\.google\.[a-z]{2,3}/q=

假设tld只有2-3个字母就可以了。如果你在正斜杠(/)之间使用它,你想要在这个正则表达式上转义它们。

答案 1 :(得分:2)

尝试

/^https?:\/\/(?:www\.)?google(?:\.[a-z]{2,3}){1,2}\/.*[&\?]q=[^&]+?/i

(?:\.[a-z]{2,3}){1,2}.com.au.co.uk等匹配。

答案 2 :(得分:2)

不要试图定制正则表达式。这将是不可维护的 - 如果你今天找不到它的问题,维护者明天有什么希望找到它的问题?

正确解析URL,可能是使用不需要维护的正则表达式,因为核心URL语法不会改变。

来自RFC 3986

  

以下行是用于将格式正确的URI引用分解为其组件的正则表达式。

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9
     

上面第二行中的数字只是为了提高可读性;   它们表示每个子表达的参考点(即每个子表达式)   配对括号)。我们引用子表达式匹配的值   <n>$<n>。例如,将上述表达式与

匹配
 http://www.ics.uci.edu/pub/ietf/uri/#Related
     

导致以下子表达式匹配:

 $1 = http:
 $2 = http
 $3 = //www.ics.uci.edu
 $4 = www.ics.uci.edu
 $5 = /pub/ietf/uri/
 $6 = <undefined>
 $7 = <undefined>
 $8 = #Related
 $9 = Related

使用它,您可以通过执行以下操作来检查JavaScript中的URL:

var match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
if (!match) { throw new Error('not a URL'); }
var url = {
  protocol: match[2],
  authority: match[4],  // host, port, username, password
  path: match[5],
  query: match[6],
  fragment: match[8]
};
if (url.protocol !== 'http' && url.protocol !== 'https') {
  throw new Error('bad protocol');
}
if (!/^www.google.[a-z]+$/.test(url.authority || '')) {
  throw new Error('bad host');
}
if (!/[?&]q=/.test(url.query || '')) {
  throw new Error('bad query');
}

这是更多的代码,但它更容易调试,维护,作为奖励,您可以定制解释URL有问题的原因。

答案 3 :(得分:1)

var regex = /^https?:\/\/(www\.)?google\.[a-z]{2,3}\/([^/]*[\&]|[\?])q=.+$/i;

答案 4 :(得分:1)

^ https?:// 添加到您已有模式的正面

  • ^将模式锚定到字符串的开头
  • http只是http
  • S'意味着1或0 s
  • :本身就是
  • 反斜杠需要转义

所以这就是整个模式:

(^https?:\/\/www\.google.*?[?&]q=[^&]+)

我喜欢你所拥有的模式:它不会假设TLD长度为两个或三个字符。

答案 5 :(得分:0)

这样的东西?

/https?:\/\/(www)?\.google\.[a-z]{2,3}\/[?&]q=.+/