【问题标题】:regex that gets computations out of strings从字符串中获取计算的正则表达式
【发布时间】:2013-04-17 05:56:53
【问题描述】:

我需要帮助编写一个 reg ex 或更多用于搜索字符串的内容。

首先,它搜索包含小数点或逗号的数字字符串(0 到 9),但小数点和逗号只能介于两个数字之间。没有两个小数点并排,或者两个逗号,或者一个小数点在一个逗号旁边,或者一个逗号在一个小数点旁边。

然后,如果找到了,它会在相同的字符串中搜索数字 0 到 9、左括号、左方括号或左大括号,并继续搜索,只要找到任何数字、任何括号、任何方-括号、任何大括号、两个数字之间的任何逗号、两个数字之间的任何小数点、任何加号 (+)、减号 (-)、星号 (*) 或正斜杠 (/) 以及它们之间的空格.它在最后一个空格、右括号、右方括号或右大括号处停止。

我正在尝试解析看起来像计算的数据,然后解决它。

例如在字符串中:

'The quick brown 1234*(5+2) jumps over"

取出

the 1234*(5+2)

在字符串中

'[5/{4+(5*2)-1}] on a sunny (2 day.'

只取出

[5/{4+(5*2)-1}]

【问题讨论】:

  • 这不是一个常规问题,因为正则表达式不太适合;但也许递归模式可以做到。
  • @Jack 嗯,我从没听说过递归正则表达式。
  • 相信我,你不会want to know :)

标签: php regex


【解决方案1】:

使用正则表达式无法 100% 解决此任务。最好的办法是使用正则表达式来分离看起来像表达式的东西,然后使用其他引擎来尝试计算它。

这应该是一个好的开始:取出任何连续的数字、括号、大括号和算术符号序列:

([-\+\*/\[\]\(\)\d\s]+)

如果通过计算引擎运行该匹配结果产生错误,则直接跳过它并尝试下一个匹配。

【讨论】:

  • 谢谢。我试过了,它似乎匹配所有计算,如字符串,除了它还匹配允许字符之前和中间的所有空格。如何让它只在数字、+、-、*、/、(、)、{、}、[ 或 ] 后包含空格。
  • 好吧,你可以在调用计算之前trim()你匹配的字符串。您也可以使用str_replace() 简单地删除所有空格。但是,如果您的计算引擎足够好,它应该能够自行处理额外的空间。
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2016-04-05
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多