2016-12-20 14 views
1

パターンXYXに続く文字列から3文字のすべての組み合わせを抽出しようとしています。Regex - Scalaの重複一致

ABA、DED、GHGそして、それは次のようになります:私は、スクリプトを実行すると

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

私が手

ABA、ACA、DED、DFD、温室効果ガス、ギグ

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

+1

3文字の組み合わせが必要ですか?あなたは、私が見ているものから、3番目の手紙を最初の手紙と同じにします。 –

+0

Scaladoc for Regexは、findAllInのドキュメントを見て、重複するマッチの例を表示します。 http://www.scala-lang.org/api/current/scala/util/matching/Regex.html#findAllIn(source:CharSequence):scala.util.matching.Regex.MatchIterator –

答えて

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 
} 

後方参照をチェックするためにグループとして\2に変わりますことをonline Scala demo

注ID = 2になりますと、グループ1は、あなたが必要とする値が含まれます参照してください。集める。

+0

私はCHの答えの下であなたのコメントを読んだことがあります.regexr.comは既知の制限のための*回避策を実際に示唆することなくプレーンなJS正規表現しかサポートしていないことを伝えなければなりません。これらの制限の1つは、空でないキャプチャされたグループが含まれていても、ゼロ幅のマッチを収集できることです。 [Regexr.comは私の正規表現が0文字と一致することができ、したがって無限に一致することを示しています](http://stackoverflow.com/questions/34495675/zero-length-regexes-and-infinite-matches/34495840#34495840)を参照してください。それを使用するには、最後に '.'を追加してください:' '/(?=(([[[]])(?!\2)[az]\2))./g'](http:// regexr.com/3etul)。 –

+0

あなたがSublime Textの文字列と正規表現で何をする必要があるのか​​を説明すると、私は助けになるかもしれません。それらの重複するテキストのリストを作成し、すべてのテキストを削除しますか? –

3

方法は、開始位置を消費する先読みでパターン全体を囲むように構成されています

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

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

+0

これはありがとうございます。完璧に動作します。 正規表現は素晴らしいです、私には黒い魔法のように見えます。私はまだこのコンセプトに頭を悩ませている。 Sublime Text searchやhttp://regexr.com/のようなツールでこのパターンを使用しようとすると、うまくいきません。だから私はこれを理解することでより良くなる必要があります。 ps:私はコードの出現の7日目を解決するためにこれが必要でした。 http://adventofcode.com/2016/day/7 –

+0

@oxcarh:先読みアサーションは単なるテストであり、文字を消費しないことを理解する必要があります(言い換えれば、マッチ全体は常に空文字列です)。それは崇高なテキスト(私はテストしたばかりです)でうまく動作しますが、regexr.com(おそらくバグです)でエラーが発生します。 –

関連する問題