【问题标题】:Matching Parentheses with Division Operator - Regex用除法运算符匹配括号 - 正则表达式
【发布时间】:2011-01-17 20:01:40
【问题描述】:

例子:

input: (n!/(1+n))
output: frac{n!}{1+n}

input: ((n+11)!/(n-k)^(-1))
output: frac{(n+11)!}{(n-k)^(-1)}

input: (9/10)
output: frac{9}{10}

input: ((n+11)!/(n-k)^(-1))+(11)/(2)
output: frac{(n+11)!}{(n-k)^(-1)}+(11)/(2)

如果没有子括号,则以下正则表达式有效。

\(([^\/\)]*)\/([^\)]*)\)

以下匹配括号

@\((([^()]++|\((?:[^()]++|(?R))+\))+)\)@

我只是不知道如何“组合”它们 - 编写一个正则表达式来处理除法平衡括号。

【问题讨论】:

  • 正则表达式不是复杂解析的好工具 - 尤其是,如果它需要匹配平衡的文本。您可以使用某些正则表达式变体提供的扩展来破解某些东西,但您确实希望使用实际的解析器来处理此类事情。
  • 问题是,我是如此接近。我对解析器一无所知,实现它需要的时间比我想要的要多。我知道正则表达式是可能的,对我来说这是最简单的方法。
  • 我添加了一个答案,至少适用于测试用例。随意修改它 - 它远非完美(你可以添加所有格量词,如果你勇敢的话,也许可以添加一元 +)。它最大的问题是将所有/ 视为一个分数,没有运算符的顺序:a+2/3+b -> (a+2)/(3+b)

标签: php regex pcre recursive-regex


【解决方案1】:

我认为这样的事情应该可行:

((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?)\/((?1))

现在,这可能并不完美,但想法如下:

第一组$1是((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?),即:

(A literal) (一个用括号括起来的平衡表达式),后跟一个可选运算符如果需要,还可以使用另一种平衡的表达方式。
这样写,我们可以在正则表达式的任何地方使用(?1) 来引用另一个平衡表达式。

工作示例:http://ideone.com/PNLOD

【讨论】:

  • 感谢您迄今为止所做的工作。仅当括号内有除号时,我才需要此功能。不过,这已经足够接近了,我将能够从这里弄清楚。谢谢!
  • @SamB - 没问题!顺便说一句,这是一个有趣的问题,输入/输出示例非常清楚。你是对的,我错过了外括号,但我认为它是可行的。
  • @Kobi 你有没有机会帮我把这个正则表达式改成一个 javascript 正则表达式兼容的格式?
  • @adolfosrs - JavaScript doesn't support recursive regex,因此无法适应。这里最简单的选择是提出一个新问题,我相信有人知道更好的 JavaScript 工具。
【解决方案2】:

我知道你已经接受了一个正则表达式,但你想要做的真正答案是一个合适的解析器......不,你不需要从头开始编写代码或重新发明轮子。虽然很多人讨厌 phpclasses,但您可以在其中找到的 evalMath 类对于解析和评估数学公式非常有用。有关如何使用和扩展它的详细信息,请参阅我对 similar question 的回答。

【讨论】:

  • 马克:我实际上没有做任何数学评估。我正在解析数学并自动将其转换为 LaTeX。有没有一个可以很好地解决这个问题的解析器?
  • @SamB - 在这里尝试答案:stackoverflow.com/questions/2421768/…
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 2023-03-04
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多