繁体   English   中英

正则表达式中的重叠匹配-Scala

[英]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
}

观看在线Scala演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM