Ruby 捕获字符串中任何数字字符的正则表达式

Ruby Regex To Capture Any Numerical Characters In a String

所以,我做了很多研究,并查看了大量的正则表达式文档、指南和正则表达式生成器,但我发现没有任何东西可以告诉我如何做到这一点(甚至 Whosebug 中的链接也不行)当我在这个问题的 "Title" 字段中输入 "regex" 时出现的弹出框。

基本上,我正在编写一个数学程序(在 Ruby 中)来解决一种非常具体的数学问题。将有两个采用字符串的输入(通过 gets.chomp),一个字符串将采用

的形式
2x^3+4x^2+5x-42

现在,指数(^3 和 ^2)将保持不变,正则表达式可以忽略这些,任何加减号和任何 "x" 字符也可以忽略。

所以本质上,我需要弄清楚如何编写一个正则表达式,它可以对字符串中的任何数字字符进行排序,除非它们前面有“^”(表示指数),并将它们推入数组。 (数组中的数字串后面会解析成数值)

因此,例如,理想的正则表达式将采用

8x^3-4x^2+3x-17

和return一个数组,其中包含方程

中的系数
["8", "-4", "3", "-17"]

保留 negative/subtraction 标志很重要。另一个例子:

需要

-6x^3+7x^2-5x+9

和return

["-6", "7", "-5", "9"]

我有什么想法可以着手做这件事吗?应用两个单独的正则表达式可能更容易吗? Ruby 仅供回答。

如果您将每个方程式作为字符串,那么此正则表达式将 select 仅计算系数。

正则表达式: -?\d+(?=x|$)

Regex101 Demo


备选方案

您可以拆分以下正则表达式以仅提取系数。

正则表达式: x(?:\^\d+)?\+?

Regex101 Demo


同时检查此 是否 解析数学字符串表达式。

我假设变量是小写字母并且没有空格(尽管可以在预处理步骤中轻松删除空格)。

假设:

str = "2x^3-x^2+3x-42"

我们想提取这些系数:

[2, -1, 3, -42]

由于“-1”是隐含的,所以这很复杂。与其尝试在单个正则表达式中处理这种复杂情况,不如先转换隐式的“1"s to explicit "1”更容易。我们可以这样做:

r0 = /
     (?<=\A|\+|\-) # match beginning of string, "+" or "-" in a positive lookbehind
     [a-z]         # 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"]