从文本中提取链接

时间:2015-01-12 14:09:18

标签: ruby regex

我想从一个短语中提取一个链接,它可能是最后,第一或中间的任何地方,所以我使用这个正则表达式

link=text.scan(/(^| )(http.*)($| )/)

但问题是,当链接位于中间时,它会获得整个短语直到结束。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

这是因为.*旁边的http是贪婪的。我建议你使用lookarounds。

link=text.scan(/(?<!\S)(http\S+)(?!\S)/)

OR

link=text.scan(/(?<!\S)(http\S+)/)

示例:

> "http://bar.com foo http://bar.com bar http://bar.com".scan(/(?<!\S)http\S+(?!\S)/)
=> ["http://bar.com", "http://bar.com", "http://bar.com"]

DEMO

  • (?<!\S)负面的背后隐藏声称匹配不会被非空格字符所取代。

  • http\S+匹配子字符串http以及以下一个或多个非空格字符。

答案 1 :(得分:0)

您尝试匹配的所有链接是否遵循一些简单的模式?我们需要看到更多背景信息,以便自信地为您的问题提供一个好的解决方案。

例如,正则表达式:

link=text.scan(/http.*\.com/)

......对于这项工作来说可能已经足够了(这假设所有链接都以“.com”结尾),但如果没有更多信息,我无法肯定地说。

或者再一次,例如,也许你可以使用类似的东西:

link=text.scan(/http[a-z./:]*) - 这假设所有链接仅包含小写字母“。”,“/”和“:”。