【问题标题】:extracting sub string using pattern matching in scala在scala中使用模式匹配提取子字符串
【发布时间】:2019-12-13 21:44:43
【问题描述】:

我想从uri中提取域名。

例如,正则表达式的输入可能是以下类型之一

  1. test.net
  2. https://www.test.net
  3. https://test.net
  4. http://www.test.net
  5. http://test.net

在所有情况下,输入都应该返回 test.net

下面是为我的目的而实现的代码

    val re = "([http[s]?://[w{3}\\.]?]+)(.*)".r

但我没有得到预期的结果

下面是我的输出

val re(prefix, domain) = "https://www.test.net"

前缀:字符串 = https://www.t

域名:String = est.net

我的正则表达式有什么问题,我该如何解决?

【问题讨论】:

  • “www”后面的点应该被转义。此外,加号之前的整个内容都有方括号
  • 好的,我更新了还是一样的错误
  • 而且您仍在使用方括号,而您应该使用括号。方括号仅匹配其中 1 个字符,而括号匹配整个组。我不明白你的正则表达式,但这至少应该让你更进一步:“(http(s)?://(w{3}\\.)+?)([^.]*)”跨度>
  • val re(prefix, domain) = "https://www.test.net" prefix: String = https://www.t domain: String = est.net上方的正则表达式仍然有同样的错误
  • 所以您的域名就是“www”之后的所有内容。对?是的

标签: scala


【解决方案1】:

我的正则表达式有什么问题,我该如何解决?

您使用的是character class

[http.?://(www.)?]

这意味着:

  • h
  • t
  • t
  • .
  • ?
  • :
  • /
  • /
  • (
  • w
  • w
  • w
  • .
  • )
  • ?

包含s,因此它不会匹配https://

我不清楚你为什么在这里使用字符类,也不清楚你为什么在类中使用重复字符。

理想情况下,您不应该尝试自己解析 URI;其他人已经完成了艰苦的工作。例如,您可以使用 java.net.URI 类:

import java.net.URI

val u1 = new URI("test.net")
u1.getHost
// res: String = null

val u2 = new URI("https://www.test.net")
u2.getHost
// res: String = www.test.net

val u3 = new URI("https://test.net")
u3.getHost
// res: String = test.net

val u4 = new URI("http://www.test.net")
u4.getHost
// res: String = www.test.net

val u5 = new URI("http://test.net")
u5.getHost
// res: String = test.net

很遗憾,如您所见,您想要实现的实际上并不符合官方的 URI 语法。

如果你能解决这个问题,那么你可以使用java.net.URI。否则,您将需要返回旧解决方案并自己解析 URI:

val re = "(?>https?://)?(?>www.)?([^/?#]*)".r

val re(domain1) = "test.net"
//=> domain1: String = test.net

val re(domain2) = "https://www.test.net"
//=> domain2: String = test.net

val re(domain3) = "https://test.net"
//=> domain3: String = test.net

val re(domain4) = "http://www.test.net"
//=> domain4: String = test.net

val re(domain5) = "http://test.net"
//=> domain5: String = test.net

【讨论】:

  • 除了第一种情况(这只是两个字符串,它们之间有一个.),所有其他情况都可以使用URI + 删除开头的www. 来获取。此正则表达式将匹配“你好。早上好”,而 URI 不允许这样做。
  • 问题是 OP 在所有情况下都希望 URI 的主机部分的域部分是 test.net。然而,这实际上只适用于案例#3 和#5,其中主机是www,域确实是test.net。在 #2 和 #4 的情况下,主机部分的 FQDN 只是 net,而在 #1 的情况下,URI 甚至根本没有主机部分,它只有一个路径。因此,尝试使用 URI 解析器对其进行解析是行不通的,因为 OP 的解析规则与 RFC 2396 不同
  • 既然 OP 的解析规则不遵循任何官方规范,而且 OP 也没有给出他们的解析规则,谁说“你好。早上好”不是 i> 根据其规则的有效 URI?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多