Javascript:请提供正则表达式帮助

Javascript: Regex help needed please

本文关键字:正则表达式 帮助 Javascript      更新时间:2023-09-26

说到正则表达式,我比门钉还笨,所以在制作 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(正常和安全(以及 Google 之后的任何 TLD(如 .ru、.se、.fr、.in 等(

换句话说,它应该只匹配谷歌搜索。

提前感谢您的帮助!

/莱恩

试试

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

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

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

假设 TLD 只有 2-3 个字母就可以了。如果您在正斜杠 (/( 之间使用它,则希望在此正则表达式上转义它们。

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

正确解析 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 有问题的原因的解释。

Add ^https?:// 到您已经拥有的模式的前面

  • ^ 将模式锚定到字符串的开头
  • http
  • 只是 http
  • s? 表示 1 或 0 s
  • :只是它自己
  • 反斜杠需要转义

所以这是整个模式:

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

我喜欢你的模式:它不假设 TLD 有两三个字符长。

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

像这样的东西?

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