Scala正则表达式提取URL中的域名

5
我希望使用Scala正则表达式从以下输入中提取出bell.com。我尝试了几种变化,但都没有成功。
"www.bell.com"
"bell.com"
"http://www.bell.com"
"https://www.bell.com"
"https://bell.com/about"
"https://www.bell.com?token=123"

这是我的代码,但它没有运行。
val pattern = """(?:([http|https]://)?)(?:(www\.)?)([A-Za-z0-9._%+-]+)[/]?(?:.*)""".r
url match {
  case pattern(domain) =>
    print(domain)
  case _ => print("not found!")
}

编辑: 我的正则表达式有误。感谢@Tabo指出,以下是正确的正则表达式。

(?:https?://)?(?:www\.)?([A-Za-z0-9._%+-]+)/?.*

你将如何处理子域名?你的问题可能会很棘手。 - wheaties
6
不要试图使用正则表达式处理这个。让一个URL解析器来处理它。 - jcdyer
@jcdyer,您能否提供一个示例,以便我可以批准您的答案? - angelokh
@jcdyer 我找到了这个。https://github.com/NET-A-PORTER/scala-uri 这是你要的吗? - angelokh
@angelokh:抱歉,我有一段时间没有上SO了。看起来你已经得到了答案。 - jcdyer
3个回答

7
您可以使用Java URL类来获取主机名,或者您可以查看Apache库。
new URL("https://www.bell.com?token=123").getHost

6
你可以尝试以下方法:
import java.net.URL
import util.Try

val t = "https://www.bell.com?token=123"

val url = Try { new URL(t) }.toOption

1

你应该使用java.net.URL方法,但是......

以后参考一下,你的正则表达式有几个问题。方括号匹配字符集,所以[http|https][htps|]相同(意思是'h'、't'、'p'、's'或'|')。我认为你的意思是http|https或者简单地写成https?

此外,如果你只想匹配域名,那么你只需要一个捕获组。注意,(?:blah)表示非捕获组,而(blah)表示捕获组。你的正则表达式中有三个捕获组:([http|https]://)(www\.)?([A-Za-z0-9._%+-]+)。你只需要最后一个。

尝试:

(?:https?://)?(?:www\.)?([A-Za-z0-9._%+-]+)/?.*

在这里测试 - https://regex101.com/r/xW4iY7/2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接