【问题标题】:How to remove every second space regex?如何删除每隔一个空格正则表达式?
【发布时间】:2014-02-03 18:26:05
【问题描述】:

我有这个字符串:

LP-----A0000001------A0000002

我需要将这个字符串格式化成这个字符串的正则表达式(在每个第一个之后删除每个 - )。

类似这样的:

LP-A0000001-A0000002

我正在尝试使用 preg_replace() 在 php 中执行此操作,但我无法完成。

【问题讨论】:

  • 如果您的文本没有乱七八糟(字面意思是数千)与单个破折号序列,只需使用全局查找 -+ 并替换 -

标签: php regex preg-replace spaces


【解决方案1】:

您可以尝试匹配两个或多个空格并替换为单个空格:

$out = preg_replace('/  +/', ' ', $in);

对于您的示例,它将是:

$out = preg_replace('/--+/', '-', $in);

regex101 demo

【讨论】:

  • imo 更简洁的语法:-{2,}
  • @tenub 我更喜欢--+,因为我通常希望我的代码不要占用太多水平空间,但我想这只是一个偏好问题。而且我可能打高尔夫球太多了^^;
【解决方案2】:

空格:

$result = preg_replace('~(?<= ) +~', '', $str);

(?&lt;=...) 是一个lookbehind,意思是preced by

对于所有类型的空格:

$result = preg_replace('~(?<=\s)\s+~', '', $str);

对于水平空格:

$result = preg_replace('~(?<=\h)\h+~', '', $str);

【讨论】:

    【解决方案3】:

    如果您只想用一个连字符组替换一组连字符,您可以使用以下正则表达式匹配任意长度的连字符:

    $str = 'LP-----A0000001------A0000002';
    $result = preg_replace('/(\-+)/', '-', $str);
    

    【讨论】:

    • 捕获组是不必要的(并且需要花费步骤)。 - 不需要转义。
    【解决方案4】:

    使用:/-{2,}/LP-----A0000001------A0000002 (Demo)

    这将匹配 2 个或更多连字符,并且实际上总共只会进行两次替换。

    使用:/-+/ 也将匹配单个连字符并用它们自己替换它们(浪费精力/没有变化)。

    使用lookbehind 会降低效率,因为lookarounds 需要更多的步骤来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 2011-11-01
      • 2012-11-15
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多