隔离数值方程式

时间:2012-02-23 15:49:30

标签: php regex

对于一个保理计划我正在想我是否有人可以帮助我。

说我有一个像

这样的等式
5x^2 + 3x + 7

我需要隔离5,3和7

虽然可能出现负面迹象,但也反对积极迹象。

是否有任何有效的正则表达式可以做到这一点?就像我现在这样做的方式相当长而且效率不高。

2 个答案:

答案 0 :(得分:3)

尝试使用以下正则表达式:

(?:^|[^\^])((?:\- *)?\d+)

将其与preg_match_all功能结合使用。

<强>解释

匹配所有数字

(\d+)

带有可选的负号(允许的空格)

(?:\- *)?

没有跟^符号

[^\^]

或正在进行字符串

的开始
^

(所以^|[^\^])在非捕获组中匹配

(?:^|[^\^])

答案 1 :(得分:3)

最好的方法是通过构造表达式树来解析它(就像编译器一样)。请注意,正则表达式或拆分不会考虑运算符优先级,例如(2 + x)^2

基本上5x ^ 2 + 3x + 7应解析为

          +
        /   \
      +      7
   /     \
  *        *
 / \      / \
5   ^    3   x
   / \
  x   2

但是,如果您可以采用an x^n + a(n-1) x^(n-1) + ... a1 x + a0这样的格式,那么您可以删除不需要的所有内容,可以试试这个

$string = '5x^2 + 3x + 7';
$replace = '';
$pattern = '/x(\^(\d)*)?/';

echo preg_replace( $pattern, $replacement, $string );
// echos 5 + 3 + 7;

你应该可以从那里拿走,例如

$stripped = preg_replace( $pattern, $replacement, $string );
$modified = str_replace( array( '+', '-' ), '|', $stripped );
$parts = explode( '|', $modified );
print_r( $parts );
// should be array( 5, 3, 7 );