Ruby使用正则表达式

时间:2016-08-19 01:44:26

标签: ruby regex string split

我目前处理的问题涉及按字符串分割字符串。

例如,

"111223334456777" #=> ['111','22','333','44','5','6','777']

我现在正在使用的方法是使用枚举器并将每个字符与下一个字符进行比较,然后以这种方式拆分数组。

res = []
str = "111223334456777"
group = str[0]
(1...str.length).each do |i|
  if str[i] != str[i-1]
    res << group
    group = str[i]
  else
    group << str[i]
  end
end
res << group
res #=> ['111','22','333','44','5','6','777']

我想看看我是否可以使用正则表达式执行此操作,这将使此过程更容易。我知道我可以把这个代码块放在一个方法中,但我很好奇是否可以在这里使用正则表达式。

所以我想做的是

str.split(/some regex/)

产生相同的结果。我想到了积极的前瞻,但我无法弄清楚如何让正则表达式认识到这个角色是不同的。

有没有人知道这是否可行?

3 个答案:

答案 0 :(得分:4)

str = "111333224456777"

str.scan /0+|1+|2+|3+|4+|5+|6+|7+|8+|9+/
  #=> ["111", "333", "22", "44", "5", "6", "777"]

str.scan(/((\d)\2*)/).map(&:first)
  #=> ["111", "333", "22", "44", "5", "6", "777"] 

读者:后者可以简化吗?

答案 1 :(得分:3)

chunk_while方法就是您在这里寻找的方法:

str.chars.chunk_while { |b,a| b == a }.map(&:join)

这会破坏当前字符a与前一个字符b不匹配的任何内容。如果你想限制只是数字,你可以做一些预处理。

Enumerable中有很多非常方便的方法值得探索,每个新版本的Ruby似乎都会添加更多。

答案 2 :(得分:1)

另一个使用group_by方法的选项,该方法返回一个散列,每个单独的数字作为键,一组分组数字作为值。

"111223334456777".split('').group_by { |i| i }.values.map(&:join) => => ["111", "22", "333", "44", "5", "6", "777"]

虽然它没有实现正则表达式,但其他人可能会发现它很有用。