【问题标题】:Ruby Regex To Capture Any Numerical Characters In a StringRuby 正则表达式捕获字符串中的任何数字字符
【发布时间】:2016-07-26 02:59:21
【问题描述】:

所以,我做了很多研究,查看了大量的正则表达式文档、指南和正则表达式生成器,但我没有找到可以告诉我如何做到这一点(甚至 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 只回答,请。

【问题讨论】:

  • 主要问题是当coef为1(或0)并且没有写入时。

标签: arrays ruby regex sorting polynomial-math


【解决方案1】:

如果你把每个方程当作一个字符串,那么这个正则表达式将只选择系数。

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

Regex101 Demo


替代解决方案

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

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

Regex101 Demo


还可以查看answer 以了解解析数学字符串表达式。

【讨论】:

  • 这不适用于str = "2x^3-x^2+x-42"str.split(/x(?:\^\d+)?\+?/) #=> => ["2", "-", "", "-42"]。您当然会执行一个后处理步骤,将“-”转换为“-1”,将“”转换为“1”。
  • @CarySwoveland:确实如此。欢迎提出更好的解决方案。
【解决方案2】:

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

假设:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2012-04-11
    • 2019-10-10
    • 2016-12-15
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多