Elixir:如何计算字符串中的 url

Elixir: How to count urls in a string

假设我有一个字符串:

content = "Please visit https://www.google.com...\nOr visit http://my.website.io\nhttp://myfriends.website.com\nOr https://www.myneigborsite.com, http://visit.me.com"

字符串中有 5 个 url。

如何使用语法计算 url?

我尝试过使用 Regex.scan/2 |> Enum.count/1String.split/2 |> Enum.count/1 <- 正则表达式,但我总是得到错误的输出。

我也尝试了在互联网上找到的每个 http/https 正则表达式,但仍然无法获得正确的输出。

这是我试过的一个。

iex> content
...> |> String.split(~r/^(https?):\/\/[^\s$.?#].[^\s]*$/)
...> |> Enum.count()
...> |> Kernel.-(1)
-1

另一个具有相同正则表达式的..

iex> Regex.scan(~r/^(https?):\/\/[^\s$.?#].[^\s]*$/, content) |> Enum.count()
0

但是当我检查正则表达式是否匹配某些网址时

iex> Regex.match?(~r/^(https?):\/\/[^\s$.?#].[^\s]*$/, "https://www.google.com")
true
iex(48)> Regex.match?(~r/^(https?):\/\/[^\s$.?#].[^\s]*$/, "http://my.website.io")
true

确实匹配。 我不知道出了什么问题。请帮助我。

您只需要 count 个 url,这意味着您不需要过于复杂的正则表达式。

~r|https?://[\w.-]+|
|> Regex.scan(content)
|> Enum.count()
#⇒ 5

你的尝试失败了,因为你把 $,EOL 匹配器放在表达式中,当 URL 没有终止字符串时,它显然不匹配。