Ruby Regex捕获字符串

时间:2016-04-05 23:18:34

标签: arrays ruby regex sorting polynomial-math

所以,我已经做了很多研究,并查看了大量的正则表达式文档,指南和正则表达式生成器,但我找到的任何内容都无法告诉我如何执行此操作(甚至不是StackOverflow弹出框中的链接当我在这个问题的“标题”字段中键入“正则表达式”时出现。)

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

的形式
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请回答。

2 个答案:

答案 0 :(得分:2)

如果将每个等式作为字符串,则此正则表达式将仅选择系数。

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

<强> Regex101 Demo

替代解决方案

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

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

<强> Regex101 Demo

同时检查此answer以获取解析数学字符串表达式。

答案 1 :(得分:1)

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

假设:

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