Regex中的重叠匹配 - Scala

时间:2016-12-20 13:44:18

标签: regex scala pattern-matching scala-2.12

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

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

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

aba,ded,ghg

它应该是:

aba,aca,ded,dfd,ghg,gig

它不会检测到重叠的组合。

2 个答案:

答案 0 :(得分:3)

方法包括将整个模式封装在先行中以仅消耗起始位置:

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

前瞻只是当前位置的断言(测试),内部模式不消耗字符。您要查找的结果是在第一个捕获组中(由于整个匹配为空,因此需要获取结果)。

答案 1 :(得分:2)

你需要捕捉整个模式并将其置于一个积极的前瞻之中。 Scala中的代码如下:

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

请参阅online Scala demo

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