我已经在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 ...但是我试图理解正则表达式并编写自己的正则表达式。 (只是学习)。
最佳答案
如果有固定数量的参数,则可以根据需要重复最后一组。例如,如果始终有3个参数,则可以使用
"^(\\w+):\\/{2}(\\w+)\\.([^\\/]+)([^\\?]+)\\?([^&]+)&([^&]+)&([^&]+)".r
否则,如果参数数量有所变化,则此问题将不存在仅使用正则表达式的解决方案,因为无法使用单个匹配组提取多个匹配项。有关更多信息,请参见this answer。
要变通解决此问题,您可以使用以下正则表达式
"^(\\w+):\\/{2}(\\w+)\\.([^\\/]+)([^\\?]+)\\?(.*)".r
最后一组匹配所有参数,然后使用类似
lastMatch.split("&")