簡體   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