gpt4 book ai didi

php - 将数学表达式拆分为数组而不拆分括号和单引号之间的子表达式

转载 作者:行者123 更新时间:2023-12-02 02:22:34 25 4
gpt4 key购买 nike

假设我有这个字符串:

1 + 2 * (3 + (23 + 53 - (132 / 5) + 5) - 1) + 2 / 'test + string' - 52

我想把它拆分成一个运算符和非运算符数组,但是 ()' 之间的任何内容都不能拆分。

我希望输出为:

[1, "+", 2, "*", "(3 + (23 + 53 - (132 / 5) + 5) - 1)", "+", 2, "/", "'test + string'", "-", 52]

我正在使用这段代码:

preg_split("~['\(][^'()]*['\)](*SKIP)(*F)|([+\-*/^])+~", $str, -1, PREG_SPLIT_DELIM_CAPTURE);

该技术通过运算符和 ' 实现了我想要的效果,但对于 () 却没有。然而它只保留 (132/5) (最深的嵌套括号表达式)并拆分所有其他的,给我这个输出:

[1, "+", 2, "*", "(3", "+", "(23", "+", 53, "-", "(132 / 5)", "+", "5)", "-", "1)", "+", 2, "/", "'test + string'", "-", 52]

如何确保最外面的括号表达式及其所有内容保持在一起?

最佳答案

您可以使用一个模式来递归匹配平衡括号的第一个子模式,然后使用 SKIP FAIL。交替后您仍然可以使用捕获组,这将是组 2,并且由于 PREG_SPLIT_DELIM_CAPTURE 标志,这些值将被保留。

要删除空条目,您可以添加 PREG_SPLIT_NO_EMPTY 标志。

(?:(\((?:[^()]++|(?1))*\))|'[^']*')(*SKIP)(*F)|([+\-*/^])

Regex demo

$str = "1 + 2 * (3 + (23 + 53 - (132 / 5) + 5) - 1) + 2 / 'test + string' - 52";
$result = preg_split("~(?:(\((?:[^()]++|(?1))*\))|'[^']*')(*SKIP)(*F)|([+\-*/^])~", $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

print_r($result);

输出

Array
(
[0] => 1
[1] => +
[2] => 2
[3] => *
[4] => (3 + (23 + 53 - (132 / 5) + 5) - 1)
[5] => +
[6] => 2
[7] => /
[8] => 'test + string'
[9] => -
[10] => 52
)

关于php - 将数学表达式拆分为数组而不拆分括号和单引号之间的子表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66193430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com