如何将表达式拆分为数组?

时间:2015-06-30 00:48:59

标签: ruby regex

我想将表达式字符串转换为数组。对于字符串(10+2)/33,预期结果为['(', '10', '+', '2', ')', '/', '33']。它们之间可能存在一些空格,有效运算符为+-*/()

3 个答案:

答案 0 :(得分:1)

您可以使用此模式:

"(10+2)/33".split(/\b|(?!\d)/)

(显然,这里的目标是分割字符串,而不是检查字符是否被允许)。

我们的想法是使用()+-/*是单个字符的事实不在\w字符类中。因此\b将匹配数字后跟其中一个字符,反之亦然。 (?!\d) (负面外观:未跟随数字),因为它是第二种选择,就像\B(?!\d)一样,会在两个符号之间匹配。

如果您想处理最终空格,您只需在每个分支中添加\s*

"(10+2)/33".split(/\s*\b\s*|\s*(?!\d)/)

请注意,它可能会在开头生成一个空项目。

要避免此问题,您可以使用不同模式的scan方法:

" ( 2 (10+2) / 33) ".scan(/\G\s*\K(?:\d+|\S)/)

其中\G确保所有匹配从字符串的开头连续,\K从匹配结果左侧丢弃所有匹配(最终的空格)。

答案 1 :(得分:0)

"(10 + 2) / 33".delete(" ").split(/(\D)/).reject(&:empty?)
# => ["(", "10", "+", "2", ")", "/", "33"]

答案 2 :(得分:0)

您也可以使用scan功能。

> s = "(10+2)/33"
> s.scan(/\d+|[^\s\w]/)
=> ["(", "10", "+", "2", ")", "/", "33"]
> s.scan(/\d+|[^\s\d]/)
=> ["(", "10", "+", "2", ")", "/", "33"]