我有一个字符串'aabaaa'
。我如何使用正则表达式捕获连续的字符,以便得到类似下面的内容?
[['aa'], ['b'], ['aaa']]
我有兴趣确定每个角色连续出现的次数。
答案 0 :(得分:4)
出于好奇:
ruby> = 2.4
'aabaaa'.each_char.chunk_while(&:==).map(&:join) # or .map(&:length)
#⇒ ["aa", "b", "aaa"]
ruby> = 2.3 (加入Cary Swoveland)
'aabaaa'.each_char.chunk(&:itself).map(&:join)
∀ruby
'aabaaa'.scan(/(\w)(\1*)/).map(&:join)
#⇒ ["aa", "b", "aaa"]
'aabaaa'.scan(/(\w)(\1*)/).map(&:join).map(&:length)
#⇒ [2, 1, 3]
答案 1 :(得分:1)
您可以使用String.prototype.match()
与RegExp
/(\w)(?=\1|[^\1])\1+|(\w)(?!\2)/g)
匹配单词字符,后跟一个或多个捕获组或单词后跟捕获组。
或者,根据@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);
答案 2 :(得分:0)
在Ruby中,
'aabaaa'.scan(/(?<s>(?<c>.)\k<c>*)/).map(&:first)
# => ["aa", "b", "aaa"]
'aabaaa'.scan(/(?<s>(?<c>.)\k<c>*)/).map{|s, _| s.length}
# => [2, 1, 3]