如何捕获字符串中的连续字符

时间:2017-05-18 05:41:42

标签: javascript ruby regex

我有一个字符串'aabaaa'。我如何使用正则表达式捕获连续的字符,以便得到类似下面的内容?

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

我有兴趣确定每个角色连续出现的次数。

3 个答案:

答案 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]