Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将表达式拆分为数组?_Ruby_Regex - Fatal编程技术网

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"]