2

パターンXYXに従って、文字列から3文字の可能な組み合わせをすべて抽出しようとしています。

val text = "abaca dedfd ghgig"
val p = """([a-z])(?!\1)[a-z]\1""".r
p.findAllIn(text).toArray

スクリプトを実行すると、次のようになります。

アバ、デッド、グッ

そして、それは次のようになります。

アバ、アカ、デッド、DFD、GHG、ギグ

重複した組み合わせは検出しません。

4

2 に答える 2

3

方法は、パターン全体を先読みで囲み、開始位置のみを消費することです。

val p = """(?=(([a-z])(?!\2)[a-z]\2))""".r
p.findAllIn(text).matchData foreach {
   m => println(m.group(1))
}

先読みは現在位置のアサーション (テスト) にすぎず、内部のパターンは文字を消費しません。探している結果は最初のキャプチャ グループにあります (一致全体が空であるため、結果を取得するために必要です)。

于 2016-12-20T13:49:46.767 に答える
2

パターン全体を捉えて、前向きな先読みの中に入れる必要があります。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 には収集する必要がある値が含まれるため、後方参照が に変わることに注意してください。

于 2016-12-20T13:50:06.387 に答える