我想使用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._%+-]+)/?.*
答案 0 :(得分:5)
您可以尝试:
import java.net.URL
import util.Try
val t = "https://www.bell.com?token=123"
val url = Try { new URL(t) }.toOption
答案 1 :(得分:3)
您可以使用Java URL类获取Host,也可以检查Apache库
new URL("https://www.bell.com?token=123").getHost
答案 2 :(得分:0)
你应该使用java.net.URL
方法,但是......
为了将来参考,您的正则表达式中有几个问题。方括号与字符集匹配,因此[http|https]
与[htps|]
相同(意思是' h',' t',' p',& #39; s'或' |')。我认为您的意思是http|https
或只是https?
。
此外,如果您只是尝试匹配只是域,则您只想拥有一个捕获组。请注意,(?:blah)
表示非捕获组,而(blah)
表示捕获组。正则表达式中的三个捕获组是([http|https]://)
,(www\.)?
和([A-Za-z0-9._%+-]+)
。你真的只想要最后一个。
尝试:
(?:https?://)?(?:www\.)?([A-Za-z0-9._%+-]+)/?.*