我已经在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("&")

07-24 18:46