Ruby 如何将表达式拆分为数组?
我想将表达式字符串转换为数组。对于字符串Ruby 如何将表达式拆分为数组?,ruby,regex,Ruby,Regex,我想将表达式字符串转换为数组。对于字符串(10+2)/33,预期结果是['('、'10'、'+'、'2'、')'、'/'、'33']。它们之间可能有一些空格,有效的运算符是+-*/() 您可以使用此模式: "(10+2)/33".split(/\b|(?!\d)/) (显然,这里的目标是分割字符串,而不是检查是否允许使用字符) 我们的想法是使用以下事实:(,),+,-,/,*是不在\w字符类中的单个字符。因此,\b将在数字后面跟这些字符之一时匹配,反之亦然(?!\d)(负数:后面不跟数字),因
(10+2)/33
,预期结果是['('、'10'、'+'、'2'、')'、'/'、'33']
。它们之间可能有一些空格,有效的运算符是+-*/()
您可以使用此模式:
"(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
丢弃匹配结果左侧的所有内容(最终的空格)。您也可以使用扫描
功能
> s = "(10+2)/33"
> s.scan(/\d+|[^\s\w]/)
=> ["(", "10", "+", "2", ")", "/", "33"]
> s.scan(/\d+|[^\s\d]/)
=> ["(", "10", "+", "2", ")", "/", "33"]
我可以使用result_array.compact删除空格。非常感谢。
> s = "(10+2)/33"
> s.scan(/\d+|[^\s\w]/)
=> ["(", "10", "+", "2", ")", "/", "33"]
> s.scan(/\d+|[^\s\d]/)
=> ["(", "10", "+", "2", ")", "/", "33"]