1

我有一个来自 JSON squirt 的 key=>value 对列表。我对数组进行了排序,剩下以下内容(摘录相关案例,因为它们高达 92):

dir1summary
dir10summary
dir1summarydue
dir10summarydue
directive1
directive10
directivecode1
directivecode10

我需要做的是:1)将所有数字放在最后,2)将它们填充到 2 位数字(01,02,&c)所以列表最终看起来像这样:

directivesummary01
directivesummary10
directivesummarydue01
directivesummarydue10
directive01
directive10
directivecode01
directivecode10

鉴于键名明显相似,我希望用一个 REGEX 语句来做到这一点,但我迷路了。这是我到目前为止所拥有的:

dir((\d{1,2}(summary|summarydue))|((ective\d{1,2})|(ectivecode\d{1,2})))

...aaaand 我不知道下一步该做什么。如何继续前进?有没有更好的紧凑方式来做到这一点?

编辑:这也意味着我必须用“指令”替换“目录”。它隐含在结果列表中,但我没有为它制作项目符号。此外,REGEX 是我在RegExer能够构建的全部内容。因此“失去了下一步该做什么”部分。

4

1 回答 1

2
  • 匹配但不捕获dir
  • 匹配但不捕获可选子字符串ective
  • 在捕获组 #1之后立即保留零个或多个非数字字符ective(这说明了可选的子字符串,例如summarydue
  • 保留整个整数作为捕获组 #2
  • 保留字符串的其余部分作为捕获组 #3


  • 在自定义函数中, hardcode directive,然后追加捕获组#1(可能为空),然后捕获组#3(也可能为空),最后将捕获组#2 保留为零到最大长度为 2 位并将该值附加到字符串的末尾

代码:(演示

$strings = [
    'dir1summary',
    'dir10summary',
    'dir1summarydue',
    'dir10summarydue',
    'directive1',
    'directive10',
    'directivecode1',
    'directivecode10',
];

var_export(
    preg_replace_callback(
        '/dir(?:ective)?(\D*)(\d+)(.*)/',
        function ($m) {
            return "directive{$m[1]}{$m[3]}" . str_pad($m[2], 2, "0", STR_PAD_LEFT);
        },
        $strings
    )
);

输出:

array (
  0 => 'directivesummary01',
  1 => 'directivesummary10',
  2 => 'directivesummarydue01',
  3 => 'directivesummarydue10',
  4 => 'directive01',
  5 => 'directive10',
  6 => 'directivecode01',
  7 => 'directivecode10',
)
于 2020-03-04T05:34:37.167 回答