PHP正则表达式排列

时间:2015-02-14 10:32:09

标签: php regex

我有一个字符串,例如HRJSHR并搜索查找A-Z的所有可能排列的方法,其长度为2个或更多字母。例如

  • HR,RJ,JS,SH,HR
  • HRJ,RJS,JSH,SHR
  • HRJS,RJSH,JSHR
  • HRJSH,RJSHR
  • HRJSHR

|[A-Z]{2,}|只返回整个字符串“HRJSHR”和|[A-Z]{2}|只返回2个字母的长度。 |[A-Z]{2+}|不起作用。

哪个正则表达式会找到A-Z的所有排列,字符串中的字母长度为2个以上?

1 个答案:

答案 0 :(得分:3)

可以在lookahead内捕获:(?=([A-Z]{2}))会匹配由两个[A-Z]组成的所有子字符串,例如HRRJJSSHHR。请参阅test at regex101

enter image description here

将它与循环结合以获得所需的结果:

$str =  "HRJSHR"; $res = array();

for($i=2; preg_match_all('/(?=([A-Z]{'.$i.'}))/', $str, $out); $i++)
  $res[$i] = $out[1];

print_r($res);

请参阅test at eval.in输出到

Array
(
    [2] => Array
        (
            [0] => HR
            [1] => RJ
            [2] => JS
            [3] => SH
            [4] => HR
        )

    [3] => Array
        (
            [0] => HRJ
            [1] => RJS
            [2] => JSH
            [3] => SHR
        )

    [4] => Array
        (
            [0] => HRJS
            [1] => RJSH
            [2] => JSHR
        )

    [5] => Array
        (
            [0] => HRJSH
            [1] => RJSHR
        )

    [6] => Array
        (
            [0] => HRJSHR
        )

)

对于未按长度分组的结果,请使用:
$res = array_merge($res, $out[1]);代替$res[$i] = $out[1];