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