Scala Regex解析URL

时间:2016-03-03 20:56:51

标签: java regex scala

我在scala中编写了这段代码

val regex = "^(\\w+):\\/{2}(\\w*)\\.?([^\\/]*)([^\\?]*)\\??(.*)?".r
val x = "http://www.google.com/foo/bar/baz.html?x=10&y=20&z=20"
regex.findAllIn(x).matchData.foreach{x=> println(s"${x.group(1)} ${x.group(2)} ${x.group(3)} ${x.group(4)} ${x.group(5)}")

这非常有效,我得到了所需的

输出
http 
www 
google.com 
/foo/bar/baz.html 
x=10

但是我需要一种方法来循环最后一部分并为所有参数生成字符串,如

x=10
y=20
z=30

我不清楚如何以循环方式提取最后一部分。

我知道有很多现有的正则表达式可以解析互联网上的URL ...但我正在尝试理解正则表达式并编写自己的正则表达式。 (只是为了学习)。

1 个答案:

答案 0 :(得分:3)

如果有固定数量的参数,您可以根据需要重复最后一组。例如,如果总有3个参数,则使用

"^(\\w+):\\/{2}(\\w+)\\.([^\\/]+)([^\\?]+)\\?([^&]+)&([^&]+)&([^&]+)".r

否则,如果参数数量不同,则此问题不存在仅正则表达式解决方案,因为无法使用单个匹配组提取多个匹配项。有关详细信息,请参阅this answer

要解决此问题,可以使用以下正则表达式

"^(\\w+):\\/{2}(\\w+)\\.([^\\/]+)([^\\?]+)\\?(.*)".r

其中最后一组匹配所有参数,然后使用类似

的内容拆分最后一个匹配
lastMatch.split("&")