单行收集多个模式匹配并同时删除它们

时间:2012-06-24 02:52:31

标签: ruby regex

我有一堆看起来如下的字符串:

str = 'CA3 03223-DG 0101-CA2 0101-CA1 0101 pyramidal cells c (PC-c)'

也就是说,有一串连字符分隔的前导字符串,如“CA3 03223”,后跟一些单词(在上面的例子中,“金字塔单元格c(PC-c)”。我想,在一行中,将所有前导的,连字符分隔的片段收集到一个数组中,同时从str中删除它们。在这一行的末尾,我应该有一个如下所示的数组:

['CA3 03223', 'DG 0101', 'CA2 0101', 'CA1 0101']

str应该是:

'pyramidal cells c (PC-c)'

我目前的解决方案是:

myarray = []; match = ''
myarray << match.strip[0..-2] while (match = str.slice!(/[A-Z0-9]{2,3} \d{3,}[\-\s]/))

相当难看,我知道。如何将其缩短为一条合理长度的线?我正在寻找像String#scan这样的东西来删除它找到的匹配。

1 个答案:

答案 0 :(得分:1)

这样的事情可能是最干净的:

myarray, str = str.scan(re), str.gsub(re, '')

如果你想要一个单行,你可以将正则表达式内联移动,但我不会