在Ruby中标记字符串的更好方法是什么?

时间:2016-02-04 13:54:41

标签: ruby regex

我有一串任意字符。我想将它变成一个数组,其中每个字符都在一个数组元素中,除了连续的单词字符(\w+),它们应该在一个数组元素中结束。例如:

ab.:u/87z

应该成为

['ab','.',':','u','/','87z']

我的第一种方法是这样的:

mystring.split(/\b/)

当然,这会将非单词字符组合在一起:

['ab','.:','u','/','87','z']

我可以在后续步骤中将它们分开,但我正在寻找一种更优雅的方式。接下来我尝试了这些:

mystring.split(/(\w+|\W)/)
mystring.split(/(\b|\W)/)

两者都返回几乎所需的结果,只是它们也返回包含空字符串的数组元素,所以我必须写类似

的内容
mystring.split(/(\b|\W)/).reject(&:empty?)

现在我的问题:有更简单的方法吗?

更新:当我解释我的例子时,我犯了一个愚蠢的错误。当然' 87'和' z'应该在一起,即' 87z'我修好了我的例子。

2 个答案:

答案 0 :(得分:3)

不要使用拆分,请使用扫描方法:

> "ab.:u/87z".scan(/\w+|\W/)
=> ["ab", ".", ":", "u", "/", "87z"]

答案 1 :(得分:3)

'ab.:u/87z'.scan(/\w+|./)    #=>["ab", ".", ":", "u", "/", "87z"]

我不确定你想要什么,因为你说过单词字符(\w+)但是分开了87z。如果我没错,\w应匹配字母,数字和下划线。因此"87z"

'ab.:u/87z'.scan(/[A-Za-z]+|\d+|./)    #=>["ab", ".", ":", "u", "/", "87", "z"]

你总是可以做到这一点来实现你在那里展示的东西