在 scala 中使用模式匹配提取子字符串



我想从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(前缀,域( = "https://www.test.net">

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

域:字符串 = est.net

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

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

您正在使用字符类

[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

最新更新