Scala正则表达式获取所有字符串匹配输入

bgtovc5b  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(147)

我有下面的Scala函数。

def getMatchesFor(input: String, matchId: String): List[String] = {
  val regex = s"""${matchId}_\w*""".r
  (regex findAllIn input).toList
}

函数的期望值是什么

val input = "abc_1_1_1_0abc_1_0_1"
  val result = getMatchesFor(input, "abc")

result应为List("abc_1_1_1_0", "abc_1_0_1")
到目前为止,我已经尝试了val r = s"${matchId}_\\w*".r,但它并没有像预期的那样工作。
我如何解决此问题?

fbcarpbf

fbcarpbf1#

下面是一个符合您需求的正则表达式:

val regex = s"${matchId}_\\w*?((?=${matchId})|\\W|$$)".r

\w*必须不是贪婪的,否则它将匹配所有内容。它应该只匹配,直到后面跟上:

  • 下一个matchId使用前视(?=${matchId})
  • 非单词字符\W
  • 或行尾$

另一种方法可能是简单地使用matchId拆分字符串,并从各个部分中提取剩余的匹配_\w*(忽略第一次拆分)。

nbnkbykc

nbnkbykc2#

另一种选择是使用拆分和积极的前瞻。
有关拆分,请参见the positions

def getMatchesFor(input: String, matchId: String): List[String] = {
    val regex = s"""(?=${matchId}_)""".r
    regex.split(input).toList
}

输出

List(abc_1_1_1_0, abc_1_0_1)

相关问题