2016-05-21 11 views
2

私は、任意の量の3つのユニークな文字を含むサブストリングをキャプチャします正規表現を考案しようとしています。Rubyの正規表現の連続したユニークな文字列</p> <blockquote> <p>aabbaacceeeeeaa</p> </blockquote> <p>考える

["aabbaacc", "bbaacc", "aacceeeeaa" "cceeeeaa"]. 

私はそれらが不完全である知っている

/[(\w)\1+]/ or /[(\w)(?!\1)]/ 

のようなものを試してみました。私が正しい道にいるかどうかわからない。

しかし、すでに一致した文字をどのように除外するか、少なくとも私は使用できないようですか?正しく。

正規表現と
+0

あなたがしていることは明確ではありません。 – sawa

答えて

3

運のベスト、しかし、あなたが

def pull_subs(str, n) 
    arr = str.chars 
    (n..str.size).each_with_object([]) { |i,a| arr.each_cons(i) { |b| 
    a << b.join if b.uniq.size == n } } 
end 

str = "aabbaacceeeeeaa" 

pull_subs(str, 3) 
    #=> ["baac", "acce", "bbaac", "baacc", "aacce", "accee", "abbaac", "bbaacc", 
    # "aaccee", "acceee", "aabbaac", "abbaacc", "aacceee", "acceeee", "ceeeeea", 
    # "aabbaacc", "aacceeee", "acceeeee", "cceeeeea", "ceeeeeaa", "aacceeeee", 
    # "acceeeeea", "cceeeeeaa", "aacceeeeea", "acceeeeeaa", "aacceeeeeaa"] 
pull_subs(str, 2) 
    #=> ["ab", "ba", "ac", "ce", "ea", "aab", "abb", "bba", "baa", "aac", "acc", 
    # "cce", "cee", "eea", "eaa", "aabb", "abba", "bbaa", "aacc", "ccee", 
    # "ceee", "eeea", "eeaa", "aabba", "abbaa", "cceee", "ceeee", "eeeea", 
    # "eeeaa", "aabbaa", "cceeee", "ceeeee", "eeeeea", "eeeeaa", "cceeeee", 
    # "eeeeeaa"] 
pull_subs(str, 4) 
    #=> ["baacce", "bbaacce", "baaccee", "abbaacce", "bbaaccee", "baacceee", 
    # "aabbaacce", "abbaaccee", "bbaacceee", "baacceeee", "aabbaaccee", 
    # "abbaacceee", "bbaacceeee", "baacceeeee", "aabbaacceee", "abbaacceeee", 
    # "bbaacceeeee", "baacceeeeea", "aabbaacceeee", "abbaacceeeee", 
    # "bbaacceeeeea", "baacceeeeeaa", "aabbaacceeeee", "abbaacceeeeea", 
    # "bbaacceeeeeaa", "aabbaacceeeeea", "abbaacceeeeeaa", "aabbaacceeeeeaa"] 
4

....、バックアップ計画を必要とする場合に予想される部分文字列が重なるのでscanでそれを行うことは不可能です。これを行う最良の方法はインデックスを使用することです。

正規表現を使用して、連続する同一文字の途中から始まる一致を除外することは困難です。

s = "aabbaacceeeeeaa" 

(1..s.length).map do 
    |i| 
    (s[i] != s[i + 1] || nil) && 
    /(.)\1*+(.)(?:\1|\2)*+(.)(?:\1|\2|\3)*/.match(s, i - 1)&.[](0) 
end.compact 
# => ["aabbaacc", "bbaacc", "aacceeeeeaa", "cceeeeeaa"] 
+0

いいです。あなたの正規表現[ここ](http://rubular.com/r/8ZvHLdv1jV)(グループ2)で遊んだ。 –

関連する問題