对于一个保理计划我正在想我是否有人可以帮助我。
说我有一个像
这样的等式5x^2 + 3x + 7
我需要隔离5,3和7
虽然可能出现负面迹象,但也反对积极迹象。是否有任何有效的正则表达式可以做到这一点?就像我现在这样做的方式相当长而且效率不高。
答案 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 );