3

免责声明:我知道 html 和 regex 不应该站在一起,但这是一个例外情况。

我需要解析 Google 搜索结果并提取缓存 url。我在页面上有这个:

<a href="/url?q=http://webcache.googleusercontent.com/search%3Fq%3Dcache:
gsNKb7ku3ewJ:somedata&ei=MyIIUtrZAcPX7AaVzIHwDg&amp;ved=0CB8QIDAC&amp;usg
=AFQjCNGcnWfdzQiTKwyAMmI-M-xzxII5Ag">Cached</a>

我尝试了简单的东西,例如:href=[\'"]?([^\'" >]+)但这不是我需要的。我想从href中提取一个参数(q)。我需要得到:

http://webcache.googleusercontent.com/search%3Fq%3Dcache:gsNKb7ku3ewJ:somedata

因此,当内容中包含单词“webcache”时,“url?q=”和第一个“&”之间的所有内容。

4

2 回答 2

1

使用前向后看,在末尾向前看来断言周围的文本,并在正则表达式中包含关键字:

(?<=url\?q=)[^&]*webcache[^&]*(?=&)

Using[^&]*确保关键字出现在目标字符串中的 & - 之前。

于 2013-08-12T00:21:23.950 回答
1

如果您的语言支持积极的后视:

(?<=q=).*?(?=[&"])

否则将组\1与此表达式匹配:

(?:q=)(.*?)(?=[&"])

解释:

  • .*?是我们表达的主体。只需匹配所有内容,但不要贪婪!
  • (?<=q=)是一个积极的后视,它说“q=”应该出现在比赛之前
  • (?=[&"])是一个积极的展望,它表示“& 或引用应该在比赛之后出现”

因为我们让它不贪心?,所以它会在第一个引号或 & 号处停止。否则它会一直匹配到结束报价。

于 2013-08-12T00:22:38.470 回答