2017-07-16 4 views
3

私はRuby 2.4を使用しています。私は、正規表現と一致する文字列の配列内に連続するトークンを見つけたいと思います。私の正規表現が正規表現と一致する配列内の連続する文字列を見つけるにはどうすればよいですか?

/\p{L}/ 

で、私の配列は

["2917", "m", "neatty", "fff", "46", "u", "28", "56"] 

であれば、私は結果が

["m", "neatty", "fff"] 

になりたいしかし、これを行うには、私の試みは失敗しました(「気づきます...)」となる。

2.4.0 :020 > arr = ["2917", "m", "neatty", "fff", "46", "u", "28", "56"] 
=> ["2917", "m", "neatty", "fff", "46", "u", "28", "56"] 
2.4.0 :021 > arr.each_cons(2).select{|pair| pair.all?{|elem| elem =~ /\p{L}/ }}.flatten 
=> ["m", "neatty", "neatty", "fff"] 

繰り返さないパターンに一致する配列内の連続したトークンを見つけるにはどうすればよいですか?

+1

が期待される結果とは何ですか'["1"、 "m"、 "m"、 "2"、 "m"] 'input? – mudasobwa

答えて

3

rは、あなたの正規表現はその後、あなたはまた、条件をバインドサブアレイの境界を見つけるためにslice_whenを使用することができますchunk_while

arr.chunk_while { |a,b| a[r] && b[r] }.select { |arr| arr.size > 1 }  
#=> [["m", "neatty", "fff"]] 
+0

私は "r"は私の正規表現だと仮定しますか?また、これは配列の配列を返すので、私が望む出力を得ることができます。私はflattenを適用できますか? – Dave

+0

はい 'r'はあなたの正規表現です(私は私の答えを更新するつもりです)。私は2次元配列として答えを残しました。これは、1つ以上の連続したマッチがある場合に起こります。しかし、ええ、あなたが好きならばそれを平らにする。 –

+1

私がコメントに投稿した質問( '["1"、 "m"、 "m"、 "2"、 "m"]の入力結果の期待結果は何ですか?この答えの正しさは未知の状態です:)。 – mudasobwa

2

を使用している場合:

> arr.slice_when {|x,y| !x[reg] || !y[reg] }.select {|e| e.length>1} 
=> [["m", "neatty", "fff"]] 
0
arr = ["2917", "m", "neatty", "fff", "46", "u", "28", "56", "hi", "%ya!"] 
r = /\p{L}/ 

arr.each_with_object([[]]) { |s,a| s.match?(r) ? (a.last << s) : a << [] }. 
    reject { |a| a.size < 2 } 
    #=> [["m", "neatty", "fff"], ["hi", "%ya!"]] 
関連する問題