正则表达式中的重叠匹配 - Scala

Overlapping matches in Regex - Scala

我正在尝试从遵循模式 XYX 的字符串中提取 3 个字母的所有可能组合。

val text = "abaca dedfd ghgig"
val p = """([a-z])(?!)[a-z]""".r
p.findAllIn(text).toArray

当我 运行 脚本时,我得到:

aba, ded, ghg

应该是:

aba、aca、ded、dfd、ghg、gig

它不检测重叠组合。

方法包括将整个模式包含在前瞻中以仅消耗起始位置:

val p = """(?=(([a-z])(?!)[a-z]))""".r
p.findAllIn(text).matchData foreach {
   m => println(m.group(1))
}

前瞻只是对当前位置的断言(测试),里面的模式不消耗字符。您要查找的结果在第一个捕获组中(这是获得结果所必需的,因为整个匹配项都是空的)。

您需要捕获整个模式并将其置于正前瞻中。 Scala 中的代码如下:

object Main extends App {
    val text = "abaca dedfd ghgig"
    val p = """(?=(([a-z])(?!)[a-z]))""".r
    val allMatches = p.findAllMatchIn(text).map(_.group(1))
    println(allMatches.mkString(", "))
    // => aba, aca, ded, dfd, ghg, gig
}

online Scala demo

请注意,反向引用将变为 ,因为要检查的组的 ID = 2,而组 1 将包含您需要收集的值。