仅在特殊条件下从字符串中删除数字的正则表达式指南
Regex guide to remove digits from string in special conditions only
我需要用 PHP 代码从字符串中删除数字。但问题是 —
- 如果数字在字符串中并且前后有 space
- 如果它们在字符串的开头,那么它需要在数字后 space。
- 如果它们在字符串的末尾,那么它需要在数字之前 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+ 个数字
$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',
)
我需要用 PHP 代码从字符串中删除数字。但问题是 —
- 如果数字在字符串中并且前后有 space
- 如果它们在字符串的开头,那么它需要在数字后 space。
- 如果它们在字符串的末尾,那么它需要在数字之前 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+ 个数字
$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',
)