【问题标题】:How to use regex to get multiple occurrences of formula in PHP如何使用正则表达式在 PHP 中获取多次出现的公式
【发布时间】:2020-12-31 16:05:13
【问题描述】:

我想从这个字符串中提取每个算术公式:

+100*25-30

我使用了这个正则表达式:

preg_match_all("/(([\*\+\-\/])([0-9]+\.?[0-9]*))+/", "+100*25-30", $match);

它只捕获最后一次出现,即 -30 但是如果我在这样的运算符之前输入空格:+100 *25 -30,它会正确捕获所有内容,但我应该在没有空格的情况下这样做。怎么做?

【问题讨论】:

  • 你有这个(...)+。只需删除除... 之外的所有内容。 See it in action
  • @revo 是的,你是对的。看到 Wiktor Stribiżew 的回答后,我明白了。

标签: php regex multiple-occurrence


【解决方案1】:

(([\*\+\-\/])([0-9]+\.?[0-9]*))+ 模式是 repeated capturing group 的一个示例。由于它匹配整个 +100*25-30 字符串,捕获每对匹配运算符及其后面的数字,因此只有捕获的最后一个匹配项存储在组 1 中(即 -30)。

你可以使用

preg_match_all("/([*+\/-]?)([0-9]+\.?[0-9]*)/", "+100*25-30", $match)

请参阅PHP demo。或者,preg_match_all("/([*+\/-]?)([0-9]*\.?[0-9]+)/", "+100*25-30", $match)。

另见regex demo.

详情:

  • ([*+\/-]?) - 第 1 组:可选的 *、+、/ 或 - 字符
  • ([0-9]*\.?[0-9]+) - 第 2 组:零个或多个数字,可选的 . 和一个或多个数字。

【讨论】:

  • 非常感谢。现在我明白了一件事。 + 在我的正则表达式末尾是我的错误。如果我最后删除 + ,它正在工作。在您的正则表达式中,您添加了 ?在运算符之后:[*+\/-]?为什么是 ?这里需要吗?必须至少存在一个运算符。我认为 ?表示零个或更正确?
  • @Jamol 我将数学运算符设为可选。 ? 匹配 1 次或 0 次,即贪婪地,至少匹配一次,但模式也可能丢失。如果您不使用它,则没有运算符的数字(例如,在字符串的开头)将无法匹配。如果您需要在字符串或运算符的开头显式匹配,您也可以考虑使用([*+\/-]|^) 而不是([*+\/-]?)。
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 2013-09-29
  • 2014-02-04
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多