正则表达式收集批量增加长度的子字符串排列

问题描述 投票:0回答:1

我有一个字符串,例如

HRJSHR
并寻找一种方法来找到长度为 2 个或更多字母的
A-Z
的所有可能排列。例如

  • 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+}|
不起作用。

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

php regex permutation regex-look-ahead
1个回答
3
投票

可以在 lookahead 中捕获:

(?=([A-Z]{2}))
将匹配由两个
[A-Z]
组成的所有子字符串,例如
HR
RJ
JS
SH
HR
。请参阅 在 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);

参见 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];

© www.soinside.com 2019 - 2024. All rights reserved.