R = /
(?: # begin a non-capture group
(?<= # begin a positive lookbehind
\d # match a digit
[ ]? # optionally match a space
) # end positive lookbehind
- # match a minus sign
) # end non-capture group
| # or
-? # optionally match a minus sign
\d+ # match one or more digits
(?: # begin a non-capture group
\. # match a period
\d+ # match one or more digits
) # end non-capture group
? # optionally match non-capture group above
| # or
\S # match a non-whitespace character
/x # free-spacing regex definition mode
def doit(str)
str.scan(R)
end
doit "2 + 3 * ( 2 + 2 )"
#=> ["2", "+", "3", "*", "(", "2", "+", "2", ")"]
doit "2+3*(2+2)"
#=> ["2", "+", "3", "*", "(", "2", "+", "2", ")"]
doit "22+33*(22+22)"
#=> ["22", "+", "33", "*", "(", "22", "+", "22", ")"]
doit "(22+33)!*(22-12)"
#=> ["(", "22", "+", "33", ")", "!", "*", "(", "22",
# "-", "12", ")"]
doit "(22-33)*(22/-12)"
#=> ["(", "22", "-", "33", ")", "*", "(", "22", "/",
# "-12", ")"]
doit "(22+33.4)*(22/-12.3)"
#=> ["(", "22", "+", "33.4", ")", "*", "(", "22", "/",
# "-12.3", ")"]
doit "2-1"
#=> ["2", "-", "1"]
doit ".2"
#=> [".", "2"]
Регулярное выражение обычно записывается следующим образом.
/(?:(?<=\d )-)|-?\d+(?:\.\d+)?|\S/
Обратите внимание, что пробел в регулярном выражении должен быть защищенв классе символов ([ ]
), когда используется режим свободного пробела, в качестве пробелов, удаленных до вычисления выражения.