【问题标题】:Ruby find a whole math expression in a string using RegEx [duplicate]Ruby 使用 RegEx 在字符串中查找整个数学表达式 [重复]
【发布时间】:2014-06-28 02:31:04
【问题描述】:

我正在尝试编写一个程序,该程序将接收一个字符串并使用 RegEx 搜索某些数学表达式,例如 1 * 3 + 4 / 2。要查找的运算符只有 [- * + /]。

到目前为止:

string = "something something nothing 1/ 2 * 3 nothing hello world"

a = /\d+\s*[\+ \* \/ -]\s*\d+/

puts a.match(string)

产生:

1/ 2

我想掌握整个方程 1/ 2 * 3。我对正则表达式的世界基本上是全新的,所以任何帮助都将不胜感激!

新信息:

a = /\s*-?\d+(?:\s*[-\+\*\/]\s*\d+)+/

感谢zx81的回答。我必须修改它才能工作。由于某种原因 ^ 和 $ 不会为 a.match(string) 产生任何输出,或者可能是 nil 输出。此外,某些运算符之前需要一个 \。

使用括号的版本:

a = /\(* \s* \d+ \s* (( [-\+\*\/] \s* \d+ \)* \s* ) | ( [-\+\*\/] \s* \(* \s* \d+ \s* ))+/

【问题讨论】:

  • 请阐明您所说的数学表达式是什么意思。例如,它是否可以包含^ 之类的符号、希腊字母、log 之类的单词等。坦率地说,我怀疑您能否将其变成一个明确的问题。
  • @Fabric,我认为这是一个不同的问题。它会处理像"/**123**/" 这样的字符串,但这不是数学表达式。
  • 如果你不关心括号:-?\d+(\s?[\+\-\*\/]\s?-?\d)+demo
  • 非常抱歉没有说出什么样的数学方程。我更担心我的语法!我担心的唯一运算符是“+”、“/”、“*”和“-”,以及数字和括号。我的主要疏忽!
  • Delliardo,你被原谅了,但就这一次 :-) 然而,你与@zx81 的心灵融合似乎奏效了。我很高兴你得到了你想要的答案。进行编辑以澄清您的问题还为时不晚。许多其他人将来可能会读到这篇文章,他们会很感激的。

标签: ruby regex


【解决方案1】:

正则表达式计算器

首先,您可能想看看这个关于 Regex Calculators(RPN 和非 RPN 版本)的问题。

但是我们不处理括号,所以我们可以使用类似的东西:

^\s*-?\d+(?:\s*[-+*/]\s*\d+)+$

demo

说明

  • ^ 锚断言我们位于字符串的开头
  • \s* 允许使用可选空格
  • -? 允许在第一位数字前加减号
  • \d+ 匹配第一位数字
  • 非捕获组(?:\s*[-+*/]\s*\d+) 匹配可选空格、运算符、可选空格和数字
  • + 量词匹配一次或多次
  • $ 锚断言我们在字符串的末尾

【讨论】:

  • FYI 添加了演示和解释
  • @CarySwoveland 也许这个通过了你的仔细审查;)
  • 当我将正则表达式应用于Riemann–Lebesgue lemma 的核心数学表达式时,它失败了。对不起。
  • @CarySwoveland 抱歉,我不确定我是否应该发现讽刺意味。 :) 你是说它不符合 OP 的要求,还是那个 Wikipedia 页面上的怪物?
  • 只是指出“任何数学表达式”是一个相当广泛的术语。据推测,OP 已经想到了一些非常有限的数学表达式形式,但没有澄清,我们只能猜测它们可能是什么。另请注意,OP 没有说明评估表达式,只是找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多