预匹配以捕获简单的数学问题


Preg_match to capture simple math problems

我有一个preg_match()来尝试捕捉数学问题,但它只能部分工作。虽然它捕获了"加号"和最后一个"加号",但由于某种原因,它没有捕获第一个"号"。我做错了什么?

$string = "one plus one";
if (preg_match("~([0-9]|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|thousand|million|'-| )+('+|'-|'*|'/|plus|add|minus|subtract|time|multiply|divide)([0-9]|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|thousand|million|'-| )+~", $string, $match)) {    
    print_r($match);
}

结果:

Array ( [0] => one plus one [1] => [2] => plus [3] => one )

预期结果:

Array ( [0] => one plus one [1] => one [2] => plus [3] => one )

您可以将当前的捕获组和所有备选方案放入另一个捕获组,这样您就可以捕获所有内容,并且不会在每次遇到类似twenty nine的情况时都覆盖它。

~[+-] #数字符号,例如+5或-5(?:''d|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|30|40|50|60|70|80|90|100|000|million|-|''s)+)([+*/-]|加|减|减|时间|乘|除)#运算''s*[+-] #数字符号,例如+5或-5(?:''d|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|30|40|50|60|70|80|90|100|000|million|-|''s)+)~x

(修饰符x,仅用于解释和格式化)