仅在特殊条件下从字符串中删除数字的正则表达式指南

Regex guide to remove digits from string in special conditions only

我需要用 PHP 代码从字符串中删除数字。但问题是 —

  1. 如果数字在字符串中并且前后有 space
  2. 如果它们在字符串的开头,那么它需要在数字后 space。
  3. 如果它们在字符串的末尾,那么它需要在数字之前 space。

例如“需要 4 速度”应变为“需要速度”

“4 speed”应变为“speed”

“速度 4”应变为“速度”

同时

“4speed”将保持原样

“speed4”将保持原样

“speed2car”将保持原样

目前使用下面的代码最终删除所有数字,这对于给定的逻辑是不正确的

$clean_string = preg_replace('/\d/', '', $dirty_string );

如有任何帮助,我们将不胜感激。

您可以匹配字符串开头和结尾的变体,并捕获数字前后有 space 的变体。

使用preg_replace_callback,将开头和结尾的匹配项替换为空字符串,并将捕获的包含前后spaces的内容替换为单个space .

^\d+\h+|\h+\d+$|(\h+\d+\h+)

说明

  • ^\d+\h+ 字符串开头,匹配 1+ 位数字和 1+ 横白spaces
  • |
  • \h+\d+$匹配1+横白spaces,字符串末尾1+位数字
  • |
  • (\h+\d+\h+) 捕获组 1,匹配 1+ 个水平空白之间的 1+ 个数字

Regex demo | Php demo

$lines = [
    "need 4 speed",
    "4 speed",
    "speed 4",
    "4speed",
    "speed4",
    "speed2car"
];

foreach ($lines as $line) {
    $pattern = "~^\d+\h+|\h+\d+$|(\h+\d+\h+)~";
    echo preg_replace_callback($pattern, function($matches){
        return array_key_exists(1, $matches) ? " " : "";
    }, $line) . PHP_EOL;
}

输出

need speed
speed
speed
4speed
speed4
speed2car

不需要回调。

我建议的模式分为两个潜在的匹配项(一次只能参与一个。

第一个匹配的一个或多个数字后跟 space if 数字从字符串的开头开始或前面有 space .

第二个匹配 space 后跟一个或多个数字 如果 数字出现在字符串的末尾或后跟 space .

代码:(Demo)

$lines = [
    "need 4 speed",
    "4 speed",
    "speed 4",
    "4speed",
    "speed4",
    "speed2car",
    "need 4speed",
    "need4 speed",
];

var_export(
    preg_replace("~(?<= |^)\d+ | \d+(?= |$)~", '', $lines)
);

输出:

array (
  0 => 'need speed',
  1 => 'speed',
  2 => 'speed',
  3 => '4speed',
  4 => 'speed4',
  5 => 'speed2car',
  6 => 'need 4speed',
  7 => 'need4 speed',
)