preg_split 正则表达式 - 需要围绕数学运算符拆分用户输入
preg_split regex - need to split user input around mathematical operators
我需要将给定的用户字符串拆分为基于数学运算符的数组。我需要字符串拆分的符号是:
+
-
/
*
()
不过,我想扩展正则表达式以包括我将添加到我的程序中的其他运算符。
到目前为止我的正则表达式是这样的:
"((\(|\d+.+|-|\*|\/\d+\|))"
当 运行 到 regex101.com 匹配给定的输入字符串时:
(30*30)/(9+8) 和 '30*30)/(9+8)
我希望输出与此类似:
[0] =
[1] = (
[2] = 30
[3] = *
[4] = 30
[5] = )
or:
[0] =
[1] = 4
[2] = *
[3] = 4
取决于括号中是否存在于用户字符串中。
我忘记包含当前正则表达式字符串的当前结果:
使用 http://www.phpliveregex.com/ 测试 preg-split,输入字符串为:
(30*30)+(9*8)
the result:
array(3
0 =>
1 =>
2 =>
)
这是您正在寻找的模式吗?
preg_match_all("/(\(|-\d+|\d+|-|\+|\/|\*|\))/", $input, $output);
https://regex101.com/r/acKW27/3
Preg_match_all: http://www.phpliveregex.com/p/l7L
我忘记了 / 在正则表达式中。链接也更新了。
preg_split()
通过使用 PREG_SPLIT_DELIM_CAPTURE
标志保留分隔符。包括附加标志 PREG_SPLIT_NO_EMPTY
以消除任何空元素。这是一个改进的答案,可以处理您的样本输入数据,以及浮点数和负数。
代码:(Demo)
$expression = '-1*(2/(3+4)--10*-110.5/0.009+-.1)';
var_export(
preg_split(
'~(-?\d*(?:\.\d+)?|[()*/+-])~',
$expression,
0,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
)
);
输出:
array (
0 => '-1',
1 => '*',
2 => '(',
3 => '2',
4 => '/',
5 => '(',
6 => '3',
7 => '+',
8 => '4',
9 => ')',
10 => '-',
11 => '-10',
12 => '*',
13 => '-110.5',
14 => '/',
15 => '0.009',
16 => '+',
17 => '-.1',
18 => ')',
)
*注意,我上面的模式使小数点前的数字成为可选的。如果你知道你的浮点数总是在点之前有一个数字,那么你可以使用这个模式:
~(-?\d+(?:\.\d+)?|[()*/+-])~
优点是:没有空匹配,不需要PREG_SPLIT_NO_EMPTY
,提高了模式效率。
我需要将给定的用户字符串拆分为基于数学运算符的数组。我需要字符串拆分的符号是:
+
-
/
*
()
不过,我想扩展正则表达式以包括我将添加到我的程序中的其他运算符。 到目前为止我的正则表达式是这样的:
"((\(|\d+.+|-|\*|\/\d+\|))"
当 运行 到 regex101.com 匹配给定的输入字符串时: (30*30)/(9+8) 和 '30*30)/(9+8)
我希望输出与此类似:
[0] =
[1] = (
[2] = 30
[3] = *
[4] = 30
[5] = )
or:
[0] =
[1] = 4
[2] = *
[3] = 4
取决于括号中是否存在于用户字符串中。
我忘记包含当前正则表达式字符串的当前结果: 使用 http://www.phpliveregex.com/ 测试 preg-split,输入字符串为:
(30*30)+(9*8)
the result:
array(3
0 =>
1 =>
2 =>
)
这是您正在寻找的模式吗?
preg_match_all("/(\(|-\d+|\d+|-|\+|\/|\*|\))/", $input, $output);
https://regex101.com/r/acKW27/3
Preg_match_all: http://www.phpliveregex.com/p/l7L
我忘记了 / 在正则表达式中。链接也更新了。
preg_split()
通过使用 PREG_SPLIT_DELIM_CAPTURE
标志保留分隔符。包括附加标志 PREG_SPLIT_NO_EMPTY
以消除任何空元素。这是一个改进的答案,可以处理您的样本输入数据,以及浮点数和负数。
代码:(Demo)
$expression = '-1*(2/(3+4)--10*-110.5/0.009+-.1)';
var_export(
preg_split(
'~(-?\d*(?:\.\d+)?|[()*/+-])~',
$expression,
0,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
)
);
输出:
array (
0 => '-1',
1 => '*',
2 => '(',
3 => '2',
4 => '/',
5 => '(',
6 => '3',
7 => '+',
8 => '4',
9 => ')',
10 => '-',
11 => '-10',
12 => '*',
13 => '-110.5',
14 => '/',
15 => '0.009',
16 => '+',
17 => '-.1',
18 => ')',
)
*注意,我上面的模式使小数点前的数字成为可选的。如果你知道你的浮点数总是在点之前有一个数字,那么你可以使用这个模式:
~(-?\d+(?:\.\d+)?|[()*/+-])~
优点是:没有空匹配,不需要PREG_SPLIT_NO_EMPTY
,提高了模式效率。