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