我正在尝试从遵循模式 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
它不检测重叠的组合。
我正在尝试从遵循模式 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
它不检测重叠的组合。
该方法包括将整个模式包含在前瞻中以仅使用起始位置:
val p = """(?=(([a-z])(?!\2)[a-z]\2))""".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])(?!\2)[a-z]\2))""".r
val allMatches = p.findAllMatchIn(text).map(_.group(1))
println(allMatches.mkString(", "))
// => aba, aca, ded, dfd, ghg, gig
}
\2
请注意,由于要检查的组的 ID = 2,并且组 1 将包含您需要收集的值,因此反向引用将转向。