2017-05-18 7 views
1

私は文字列'aabaaa'を持っています。正規表現を使用して連続する文字を取得すると、次のようなものが得られますか?文字列内の連続する文字を取り込む方法

[['aa'], ['b'], ['aaa']] 

各文字が連続して何回出現するかを調べたいと思っています。 Rubyで

+0

私は正規表現を試みるウェブベースのツールであるhttp://www.regexr.com/ – dee

+0

[ '(\ w)を\ 1 {0、} '](https://regex101.com/r/M4yy4O/1) –

+0

@CarySwovelandはい、投稿を編集しました! –

答えて

4

ルビー> = 2.4

'aabaaa'.each_char.chunk_while(&:==).map(&:join) # or .map(&:length) 
#⇒ ["aa", "b", "aaa"] 

ルビー> = 2.3(CREDそのケーリーSwovelandへ)

'aabaaa'.each_char.chunk(&:itself).map(&:join) 

∀ルビー

'aabaaa'.scan(/(\w)(\1*)/).map(&:join) 
#⇒ ["aa", "b", "aaa"] 

'aabaaa'.scan(/(\w)(\1*)/).map(&:join).map(&:length) 
#⇒ [2, 1, 3] 
+0

完璧に動作します。私はchunk_whileを認識していませんでしたが、それは非常にきれいです! –

+0

Ruby v2.4のソリューションはありませんか? > = 2.3の場合は、 ''aabaaa.each_char.chunk(&:自体).map(&:join)'(それ自体は2.3となっています)を考えてください。 –

+0

@CarySwovel実際、ありがとうございます。 – mudasobwa

0

'aabaaa'.scan(/(?<s>(?<c>.)\k<c>*)/).map(&:first) 
# => ["aa", "b", "aaa"] 

'aabaaa'.scan(/(?<s>(?<c>.)\k<c>*)/).map{|s, _| s.length} 
# => [2, 1, 3] 
0

あなたはキャプチャグループまたはワードキャプチャグループが続かないの1以上続く単語文字に一致するようにRegExp/(\w)(?=\1|[^\1])\1+|(\w)(?!\2)/g)String.prototype.match()を使用することができます。

@mudasobwaが提案するように、RegExp/(\w)(\1*)/gを使用してください。

それぞれの一致するグループの.lengthを取得するには、配列を作成し、一致の配列を繰り返し、一致する最初の要素または一致したグループ自体にプロパティを設定します。または、Array.prototype.map()を使用して、一致する各グループの.lengthを返します。ただ、好奇心のうち

"aabaaa".match(/(\w)(?=\1)\1+|(\w)(?!\2)/g) 

let str = "aabaaa"; 
 

 
let groups = str.match(/(\w)(?=\1)\1+|(\w)(?!\2)/g); 
 

 
let matches = []; 
 

 
for (let match of groups) { 
 
    matches.push({[match]: match.length}); 
 
} 
 

 
let len = groups.map(({length}) => length); 
 

 
console.log(groups, matches, len);

+1

'str.match(/(\ 1 *)/ g)' – mudasobwa

関連する問題