【问题标题】:Better way to tokenize string in Ruby?在 Ruby 中标记字符串的更好方法?
【发布时间】:2016-02-04 13:54:40
【问题描述】:

我有一串任意字符。我想把它变成一个数组,其中每个字符都在一个数组元素中,除了连续的单词字符(\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'。我修正了我的例子。

【问题讨论】:

  • 感谢您的指出。我提供示例的错误。现在修好了。

标签: ruby regex


【解决方案1】:
'ab.:u/87z'.scan(/\w+|./)    #=>["ab", ".", ":", "u", "/", "87z"]

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

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

你总是可以这样做来实现你在那里展示的内容

【讨论】:

  • 我在编写示例时的错误。正如您正确指出的那样,不应将 87 和 z 分开。
【解决方案2】:

不要使用split,使用scan方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多