正则表达式从右到左匹配

时间:2018-11-09 15:44:20

标签: php regex

我想从右到左进行匹配,下面是这样的例子之一。

100abababab3x3x3xx1000morewords

如果我想匹配最后一个xx与前一个ab之间的某个内容并得到3x3x3

我尝试了以下操作,但它与ababab3x3x3匹配

preg_match('/ab(.*?)xx/',$text,$totmat);

注意:请不要推荐strrev。

上面的例子只是为了说明,我要做的就是从右到左匹配。

3 个答案:

答案 0 :(得分:1)

不确定这是否是最优化的方法吗?但是,如果您结合使用前瞻性肯定 (?=)后继肯定性 (?<=),这将对您有用。参见regex

<?php

$re = '/\w+(?<=ab)(.*?)(?=xx)/m';
$str = '100abababab3x3x3xx1000morewords';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the full matched result
echo $matches[0][1];

演示: https://3v4l.org/db69N

答案 1 :(得分:0)

$str = '100abababab3x3x3xx1000morewords';
preg_match('/ab((?:(?!ab).)*)xx/', $str, $m);
print_r($m);

输出:

Array
(
    [0] => ab3x3x3xx
    [1] => 3x3x3
)

>说明:

ab              : literally ab
  (             : start group 1
    (?:         : start non capture group
      (?!ab)    : negative lookahead, make sure we doon't have ab
      .         : any character but newline
    )*          : end group, may appear 0 or more times
  )             : end group 1
xx              : literally xx

答案 2 :(得分:0)

除了正则表达式外,还有其他方法可以将计算时间快两倍。

例如:

$str = "100abababab3x3x3xx1000morewords";
$result = explode("ab", explode("xx", $str)[0]);
var_dump(end($result));

第一次发生爆炸时,会将字符串分成两个“ xx”字符。我们只对左边部分(索引0)感兴趣。

第二次爆炸发生时,爆竹用ab分割线。我们只对ab的最后一次出现感兴趣。因此var_dump(end($result));打印出预期的结果。