Scala正则表达式获取路径中的参数

问题描述 投票:0回答:2

正则表达式noob在这里。

示例路径:

home://Joseph/age=20/race=human/height=170/etc

使用正则表达式,如何在/ Joseph / path和/ etc之间的“=”之后抓取所有内容?我正在尝试创建一个列表

[20, human, 170]

到目前为止我有

val pattern = ("""(?<=Joseph/)[^/]*""").r
val matches = pattern.findAllIn(path)

该模式让我得到“年龄= 20”,但我认为findAllIn会让我找到所有“参数=”匹配。在那之后,我不确定如何使用正则表达式来获得“20岁”中的“20”等。

regex scala
2个回答
0
投票

你的模式直接在Joseph/之后寻找模式,这就是为什么只有age=20匹配,也许只是照看=

val s = "home://Joseph/age=20/race=human/height=170/etc"
// s: String = home://Joseph/age=20/race=human/height=170/etc

val pattern = "(?<==)[^/]*".r
// pattern: scala.util.matching.Regex = (?<==)[^/]*

pattern.findAllIn(s).toList
// res3: List[String] = List(20, human, 170)

1
投票

See regex in use here

(?:(?<=/Joseph/)|\G(?!\A)/)[^=]+=([^=/]+)

Usage

See code in use here

object Main extends App {
    val path = "home://Joseph/age=20/race=human/height=170/etc"
    val pattern = ("""(?:(?<=/Joseph/)|\G(?!\A)/)[^=]+=([^=/]+)""").r
    pattern.findAllIn(path).matchData foreach {
        m => println(m.group(1))
    }
}

结果

Input

home://Joseph/age=20/race=human/height=170/etc

Output

20
human
170

说明

  • (?:(?<=/Joseph/)|\G(?!\A)/)符合以下条件 (?<=/Joseph/)积极的外观确保在/Joseph/字面上匹配之前 \G(?!\A)/在上一场比赛结束时断言位置,并按字面意思匹配/
  • [^=]+匹配除=之外的任何角色中的一个或多个
  • =按字面意思对比
  • ([^=/]+)将除=/之外的任何角色中的一个或多个捕获到捕获组1中
© www.soinside.com 2019 - 2024. All rights reserved.