2012-02-23 48 views
2

我正在做一个保理程序我想知道是否有人能帮助我。隔离数值公式

说我有喜欢

5x^2 + 3x + 7 

我需要隔离5,3和7

的公式虽然也可以拿出负号反对阳性体征以及。

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

回答

3

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

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

preg_match_all功能结合起来。

说明:

它匹配所有的数字

(\d+) 

可选负号(whitespacesbetween允许)

(?:\- *)? 

未遵循与^标志

非捕获的组匹配

或都在串

^ 

的beggining(所以有^|[^\^]

(?:^|[^\^]) 
+0

+1非常酷,但它不包括负面信号。 '(?:^ | [^ \ ^])( - ?\ d +)'应该解决这个问题。虽然我想这将需要'-'紧挨数字......嗯。 – ohaal 2012-02-23 15:59:52

+0

啊,你是对的 - 我只是忘了它,谢谢。 ;-) – hsz 2012-02-23 16:05:05

+0

我也已经改进了一点,允许空格。 – hsz 2012-02-23 16:08:11

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);