正则表达式使用PHP将字符串拆分为数字和字符数组

正则表达式使用PHP将字符串拆分为数字和字符数组,php,regex,preg-match,preg-split,Php,Regex,Preg Match,Preg Split,我有一个类似于以下模式的算术字符串 a。1+2+3 b。2/1*100 c。1+2+3/3*100 d。(1*2)/(3*4)*100 需要注意的是 1.字符串将永远不包含空格。 2.字符串将始终是数字、算术符号(+、-、*、/)和字符“('和')的组合 我正在寻找PHP中的正则表达式,以根据字符的类型拆分字符,并形成一个单独的字符串数组,如下所示。 (注意:我不能使用str_split,因为我希望不拆分大于10的数字。) a1+2+3 输出=>[ 0=>“1” 1=>'+' 2=>2' 3=>

我有一个类似于以下模式的算术字符串

a。1+2+3

b。2/1*100

c。1+2+3/3*100

d。(1*2)/(3*4)*100

需要注意的是
1.字符串将永远不包含空格。
2.字符串将始终是数字、算术符号(+、-、*、/)和字符“('和')的组合

我正在寻找PHP中的正则表达式,以根据字符的类型拆分字符,并形成一个单独的字符串数组,如下所示。
(注意:我不能使用str_split,因为我希望不拆分大于10的数字。)

a<代码>1+2+3
输出=>
[

0=>“1”

1=>'+'

2=>2'

3=>'+'

4=>3'

]

b<代码>2/1*100
输出=>
[

0=>“2”

1=>'/'

2=>1'

3=>'*'

4=>100'

]`

c<代码>1+2+3/3*100

输出=>
[

0=>“1”

1=>'+'

2=>2'

3=>'+'

4=>3'

5=>'/'

6=>3'

7=>“*”

8=>100'

]`

d<代码>(1*2)/(3*4)*100

输出=>
[

0=>”(“

1=>1'

2=>'*'

3=>2'

4=>)”

5=>'/'

6=>”(“

7=>3'

8=>'*'

9=>4'

10=>)”

11=>'*'

12=>100'

]

提前非常感谢。

使用此正则表达式:

(?如我所说,如果你能提供一些你自己做的工作来解决这个问题,我会帮你的

但是,如果在用算术表达式制作一维数组时,您的目标是解析和计算该数组,那么您应该构建一棵树,并通过将运算符作为节点对其进行层次化,分支是操作数:

'(1*2)/(3*4)*100'

Array
(
    [operand] => '*',
    [left] => Array
        (
            [operand] => '/',
            [left] => Array
                (
                    [operand] => '*',
                    [left] => 1,
                    [right] => 2
                ),
            [right] => Array
                (
                    [operand] => '*',
                    [left] => 3,
                    [right] => 4
                )
        ),
    [right] => 100
)

因为您声明表达式是“干净的”,没有空格之类的,所以可以在

\b|(?<=\W)(?=\W)

\b |(?这不需要使用正则表达式。只需循环字符串并根据需要构建数组即可

编辑,刚刚意识到使用while循环可以比使用for循环和if()更快地完成编辑

$str=“(10*2)/(3*40)*100”;
$str=str_split($str);//使str成为数组
$arr=array();
$j=0;//新数组的计数器

对于($i=0;$i您也可以使用匹配的正则表达式:
[()+\-*\/]\124;\ d+


我正在为php计算器演示做类似的事情

对于
preg\u split()
,请考虑此模式:

~-?\d+|[()*/+-]~
()

这还有一个额外的好处,即允许负数,而不会将负数与运算符混淆。第一个“可选”匹配正整数或负整数,而第二个“可选”(在
|
之后)匹配括号和运算符,一次一个

在php实现中,我将整个模式放在捕获组中并保留分隔符。这样就不会留下任何子字符串。
~
用作模式分隔符,因此模式中的斜杠不需要转义

代码:()

输出:

array (
  0 => '(',
  1 => '1',
  2 => '*',
  3 => '2',
  4 => ')',
  5 => '/',
  6 => '(',
  7 => '3',
  8 => '*',
  9 => '4',
  10 => ')',
  11 => '*',
  12 => '100',
  13 => '+',
  14 => '-10',
)

欢迎使用StackOverflow。不幸的是,这既不是一个教程网站,也不是web搜索的替代品。我们可以帮助您解决这个问题,但您首先要做的是解决这个问题,包括基本问题。尝试一下并提供代码,我将与您分享一种更简单的方法。您最好为这样的工作编写一个解析器。谢谢。The regex似乎正在工作,但当我运行下面的代码时-$re='10〕/(?我是不是运行错了。谢谢你,但我以前很少使用正则表达式,因此无法使用它们。@ChaitraHegde我想你应该使用preg_split函数,而不是preg_match_all。@ChaitraHegde顺便说一句,看看ClasG的答案,它比我的答案更简单。不过,你必须添加preg_split_NO_EMPTY标志来删除空的eleme返回数组中的nts。谢谢,preg_split正是我要寻找的函数,并且使用了您提供的正则表达式。@ChaitraHegde当使用您的四个测试用例字符串比较当前接受的答案和我的模式之间的步骤效率时,我的方法的速度将大约快4倍。此答案可以与如果你愿意的话,我的另一篇文章允许使用小数。
$expression='(1*2)/(3*4)*100+-10';
var_export(preg_split('~(-?\d+|[()*/+-])~',$expression,NULL,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE));
array (
  0 => '(',
  1 => '1',
  2 => '*',
  3 => '2',
  4 => ')',
  5 => '/',
  6 => '(',
  7 => '3',
  8 => '*',
  9 => '4',
  10 => ')',
  11 => '*',
  12 => '100',
  13 => '+',
  14 => '-10',
)