パターンXYXに従って、文字列から3文字の可能な組み合わせをすべて抽出しようとしています。
val text = "abaca dedfd ghgig"
val p = """([a-z])(?!\1)[a-z]\1""".r
p.findAllIn(text).toArray
スクリプトを実行すると、次のようになります。
アバ、デッド、グッ
そして、それは次のようになります。
アバ、アカ、デッド、DFD、GHG、ギグ
重複した組み合わせは検出しません。
パターンXYXに従って、文字列から3文字の可能な組み合わせをすべて抽出しようとしています。
val text = "abaca dedfd ghgig"
val p = """([a-z])(?!\1)[a-z]\1""".r
p.findAllIn(text).toArray
スクリプトを実行すると、次のようになります。
アバ、デッド、グッ
そして、それは次のようになります。
アバ、アカ、デッド、DFD、GHG、ギグ
重複した組み合わせは検出しません。
方法は、パターン全体を先読みで囲み、開始位置のみを消費することです。
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 には収集する必要がある値が含まれるため、後方参照が に変わることに注意してください。