我正在尝试从模式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
它不会检测到重叠的组合。
答案 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
}
请注意,反向引用将转为\2
,因为要检查的组将具有ID = 2,而组1将包含您需要收集的值。