[英]Overlapping matches in Regex - Scala
我正在尝试从遵循模式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组将包含您需要收集的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.