【问题标题】:Scala regex extract domain from urlsScala正则表达式从url中提取域
【发布时间】:2015-03-26 19:59:21
【问题描述】:

我想使用 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._%+-]+)/?.*

【问题讨论】:

  • 您将如何处理子域?您的问题可能很棘手。
  • 不要尝试正则表达式。让 URL 解析器处理它。
  • @jcdyer 你能举个例子让我批准你的回答吗?
  • @jcdyer 我找到了这个。 github.com/NET-A-PORTER/scala-uri这是你的意思吗?
  • @angelokh:对不起。我有一段时间没有上SO了。看起来你得到了答案。

标签: regex scala


【解决方案1】:

您可能应该使用java.net.URL方法,但是...

为了将来参考,您的正则表达式中有几个问题。方括号匹配字符集,因此[http|https][htps|] 相同(表示“h”、“t”、“p”、“s”或“|”)。我想你的意思是 http|https 或只是 https?

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

试试:

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

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

【讨论】:

    【解决方案2】:

    您可以使用 Java URL 类来获取 Host,也可以查看 Apache 库

    new URL("https://www.bell.com?token=123").getHost
    

    【讨论】:

      【解决方案3】:

      你可以试试:

      import java.net.URL
      import util.Try
      
      val t = "https://www.bell.com?token=123"
      
      val url = Try { new URL(t) }.toOption
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多