由比较运算符拆分表达式但保留分隔符

时间:2018-02-04 16:14:26

标签: php regex

可悲的是,这是另一个正则表达式问题,因为它只是出于某种原因而逃避了我的心理能力。

我在数组上运行foreach循环,如下所示

array(7) {
  [0]=>
  string(9) "(1+1)+1=2*2"
  [1]=>
  string(6) "2+3<=4"
  [2]=>
  string(8) "(2+3)>=4"
  [3]=>
  string(6) "2+3<>4"
  [4]=>
  string(5) "2+3<4"
  [5]=>
  string(5) "2+3>4"
  [6]=>
  string(9) "(2+3)+3=8"
}

我试图通过比较运算符将其拆分但保留运算符。为了举例说明我在获取密钥[0]并生成输出数组之后所做的事情。

array(){
    [0]=>
    string() "(1+1)+1"
    [1]=>
    string() "="
    [2]=>
    string() "2*2"
}

这是我到目前为止所得到的,但它没有得到运营商

preg_match_all( "~(^[()|\d|+|-|*|/]+(=)([()|\d|+|-|*|/]))~", $expression, $expression_parts );

提前致谢

1 个答案:

答案 0 :(得分:3)

通过调用preg_split()并仅隔离比较运算符,您可以节省大量的卷积。

代码:(Demo

$strings=[
    "(1+1)+1=2*2",
    "2+3<=4",
    "(2+3)>=4",
    "2+3<>4",
    "2+3<4",
    "2+3>4",
    "(2+3)+3=8"
];

foreach($strings as $string){
    var_export(preg_split('~([<>=]+)~',$string,NULL,PREG_SPLIT_DELIM_CAPTURE));
    echo "\n";
}

输出:

array (
  0 => '(1+1)+1',
  1 => '=',
  2 => '2*2',
)
array (
  0 => '2+3',
  1 => '<=',
  2 => '4',
)
array (
  0 => '(2+3)',
  1 => '>=',
  2 => '4',
)
array (
  0 => '2+3',
  1 => '<>',
  2 => '4',
)
array (
  0 => '2+3',
  1 => '<',
  2 => '4',
)
array (
  0 => '2+3',
  1 => '>',
  2 => '4',
)
array (
  0 => '(2+3)+3',
  1 => '=',
  2 => '8',
)

说明:

preg_split()explode()的多功能正则表达式版本。该模式告诉函数应该发生爆炸的每个实例。

~          #Pattern delimiter
(          #Start capture group
[<>=]+     #Match (as much as possible) one or more comparison symbols
)          #End capture group
~          #Pattern delimiter

单独的模式不能按要求工作 - 必须在此函数调用中声明标志。

参数3为NULL:这表示preg_split()无限次匹配。这是函数的默认行为,但是要使参数4起作用,我们需要使用此占位符。

参数4是PREG_SPLIT_DELIM_CAPTURE:这告诉函数保留用作“爆炸点”的子串。如果没有此标志,则输出数组将不包含比较符号。如果我们不打算使用此标志,那么捕获组括号在模式中将是不必要的。

以下是preg_split()兄弟如何使用正面和否定角色类进行操作:

foreach($strings as $string){
    var_export(preg_match('~([^<>=]+)([<>=]+)([^<>=]+)~',$string,$out)?array_slice($out,1):[]);
    echo "\n";
    var_export(preg_match_all('~[^<>=]+|[<>=]+~',$string,$out)?$out[0]:[]);
    echo "\n\n";
}