我想从一个短语中提取一个链接,它可能是最后,第一或中间的任何地方,所以我使用这个正则表达式
link=text.scan(/(^| )(http.*)($| )/)
但问题是,当链接位于中间时,它会获得整个短语直到结束。 我该怎么办?
答案 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"]
(?<!\S)
负面的背后隐藏声称匹配不会被非空格字符所取代。
http\S+
匹配子字符串http
以及以下一个或多个非空格字符。
答案 1 :(得分:0)
您尝试匹配的所有链接是否遵循一些简单的模式?我们需要看到更多背景信息,以便自信地为您的问题提供一个好的解决方案。
例如,正则表达式:
link=text.scan(/http.*\.com/)
......对于这项工作来说可能已经足够了(这假设所有链接都以“.com”结尾),但如果没有更多信息,我无法肯定地说。
或者再一次,例如,也许你可以使用类似的东西:
link=text.scan(/http[a-z./:]*)
- 这假设所有链接仅包含小写字母“。”,“/”和“:”。