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