2

我正在尝试从遵循模式 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

它不检测重叠的组合。

4

2 回答 2

3

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

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

前瞻只是对当前位置的断言(测试),内部的模式不消耗字符。您正在寻找的结果在第一个捕获组中(因为整个匹配都是空的,所以需要它来获得结果)。

于 2016-12-20T13:49:46.767 回答
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
}

查看在线 Scala 演示

\2请注意,由于要检查的组的 ID = 2,并且组 1 将包含您需要收集的值,因此反向引用将转向。

于 2016-12-20T13:50:06.387 回答