Ruby Regex捕获字符串中的任何数字字符
所以,我已经做了很多研究,并查看了大量的正则表达式文档,指南和正则表达式生成器,但我发现的任何内容都无法告诉我如何执行此操作(甚至不是在StackOverflow弹出框中出现的链接我在这个问题的“标题”字段中键入了“正则表达式”。
基本上,我正在编写一个数学程序(在Ruby中)来解决一种非常特殊的数学问题。 将有两个输入采用字符串(通过gets.chomp),一个字符串将采取的forms
2x^3+4x^2+5x-42
现在,指数(^ 3和^ 2)将保持不变,正则表达式可以忽略这些指数,任何加法和减法符号以及任何“x”字符都可以忽略。
所以从本质上讲,我需要弄清楚如何编写一个可以对字符串中的任何数字字符进行排序的正则表达式,除非它们前面有一个“^”(表示一个指数),并将它们推出到一个数组中。 (数组中的数字串将在以后解析为数值)
因此,例如,理想的正则表达式会采取类似的方式
8x^3-4x^2+3x-17
并返回一个包含等式中系数的数组
["8", "-4", "3", "-17"]
保留它们存在的负/减符号很重要。 另一个例子:
这需要
-6x^3+7x^2-5x+9
并返回
["-6", "7", "-5", "9"]
我有什么想法可以这样做吗? 应用两个单独的正则表达可能更容易吗? Ruby请回答。
如果将每个等式作为字符串,则此正则表达式将仅选择系数。
正则表达式: -?\d+(?=x|$)
Regex101演示
替代解决方案
您可以拆分以下正则表达式以仅提取系数。
正则表达式: x(?:\^\d+)?\+?
Regex101演示
同时检查此答案以解析数学字符串表达式。
我假设变量是一个小写字母,并且没有空格(尽管可以在预处理步骤中轻松删除空格)。
假设:
str = "2x^3-x^2+3x-42"
我们想提取这些系数:
[2, -1, 3, -42]
由于“-1”是隐含的,因此这很复杂。 不是试图在单个正则表达式中处理这种复杂性,而是首先将隐式“1”转换为显式“1”更容易。 我们可以这样做:
r0 = / (?<=\A|\+|\-) # match beginning of string, "+" or "-" in a positive lookbehind [az] # match a lowercase letter in a positive lookahead /x # Free-spacing regex definition mode
例如:
"x^3-x^2+x-42".gsub(r0) { |s| "1" + s } #=> "1x^3-1x^2+1x-42"
我们现在准备提取系数。
r1 = / (?:\A|[^^-]) # match beginning of the string or any character other than # carat or hyphen in a non-capture group \K # forget everything match so far \-? # optionally match a hyphen \d+ # match >= 0 digits /x "2x^3-4x^2+5x-42".scan(r1) #=> ["2", "-4", "5", "-42"]
现在结合这两个步骤:
"2y^3-y^2+y-42".gsub(r0) { |s| "1" + s }.scan(r1) #=> ["2", "-1", "1", "-42"]