【问题标题】:Clean up a comma-separated list by regex通过正则表达式清理逗号分隔的列表
【发布时间】:2022-01-13 08:42:36
【问题描述】:

我想清理以逗号分隔的标签列表以删除空标签和多余的空格。我想出了

$str='first , second ,, third, ,fourth   suffix';
echo preg_replace('#[,]{2,}#',',',preg_replace('#\s*,+\s*#',',',preg_replace('#\s+#s',' ',$str)));

到目前为止效果很好,但是否可以一次替换?

【问题讨论】:

  • 为什么要使用正则表达式?使用split()trim()array_filter() 会更容易。
  • 你想要的确切输出是什么?
  • 为什么要删除空元素?大概这代表了一些东西,而且它恰好是空白的。删除它会丢失信息。
  • @Barmar 因为目的是清理字符串,而不是提取标签。然后,我必须添加另一个步骤implode。我发现正则表达式替换更快更容易。
  • @TimBiegeleisen 预期的输出正是上面的回声。系统工作正常,我只是想尽量减少进程数。

标签: php regex preg-replace


【解决方案1】:

你可以使用:

[\h*([,\h])[,\h]*

查看在线demo。或者:

\h*([,\h])(?1)*

在线查看demo


  • \h* - 0+(贪婪)水平空白字符;
  • ([,\h]) - 第一个匹配逗号或水平空格的捕获组;
  • [,\h]* - 选项 1:0+(贪婪)逗号或水平空白字符;
  • (?1)* - 选项 2:递归第一个子模式 0+(贪婪)次。

替换为第一个捕获组:

$str='first , second ,, third, ,fourth   suffix';
echo preg_replace('~\h*([,\h])[,\h]*~', '$1', $str);
echo preg_replace('~\h*([,\h])(?1)*~', '$1', $str);

两个打印:

first,second,third,fourth suffix

【讨论】:

    【解决方案2】:

    你可以使用

    preg_replace('~\s*(?:(,)\s*)+|(\s)+~', '$1$2', $str)
    

    将两个选项合并为一个结果

    preg_replace('~\s*(?:([,\s])\s*)+~', '$1', $str)
    

    请参阅 regex demoPHP demo详情

    • \s*(?:(,)\s*)+ - 零个或多个空格,然后出现一个或多个逗号(捕获到第 1 组 ($1)),然后是零个或多个空格
    • | - 或
    • (\s)+ - 一个或多个空格,同时将最后一个空格捕获到第 2 组 ($2)。

    在第二个正则表达式中,([,\s]) 捕获单个逗号或空格字符。

    第二个正则表达式匹配:

    • \s* - 零个或多个空格
    • (?:([,\s])\s*)+ - 出现一次或多次
      • ([,\s]) - 第 1 组 ($1):逗号或空格
      • \s* - 零个或多个空格

    PHP demo

    <?php
     
    $str='first , second ,, third, ,fourth   suffix';
    echo preg_replace('~\s*(?:(,)\s*)+|(\s)+~', '$1$2', $str) . PHP_EOL;
    echo preg_replace('~\s*(?:([,\s])\s*)+~', '$1', $str);
    // => first,second,third,fourth suffix
    //    first,second,third,fourth suffix
    

    奖金

    此解决方案可移植到所有 NFA 正则表达式风格,这是一个 JavaScript 演示:

    const str = 'first , second ,, third, ,fourth   suffix';
    console.log(str.replace(/\s*(?:(,)\s*)+|(\s)+/g, '$1$2'));
    console.log(str.replace(/\s*(?:([,\s])\s*)+/g, '$1'));

    它甚至可以进行调整以用于 POSIX 工具,例如 sed

    sed -E 's/[[:space:]]*(([,[:space:]])[[:space:]]*)+/\2/g' file > outputfile
    

    请参阅online demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多