我想从uri中提取域名。
例如,正则表达式的输入可能是以下类型之一
- test.net
- https://www.test.net
- https://test.net
- http://www.test.net
- 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