Php 删除某些字符串前的空格

Php 删除某些字符串前的空格,php,regex,Php,Regex,我可以想到“foreach string replace”这样做,但觉得regex replace方法会更快、更优雅,不幸的是,regex不是我最擅长的东西 我想拿一根这样的绳子 23 AB 5400 DE 68 RG 把它变成 23AB 5400DE 68RG 数字和后面字母之间的空格数通常为一,但可能是可变的 我有一个例子,那就是寻找组,但是我如何去掉替换中的空格呢 这是我尝试生成的代码 $re = '/(\d+ +)(AB|DE|RG|DU)/m'; $str = '23 AB 5400

我可以想到“foreach string replace”这样做,但觉得regex replace方法会更快、更优雅,不幸的是,regex不是我最擅长的东西

我想拿一根这样的绳子

23 AB 5400 DE 68 RG

把它变成

23AB 5400DE 68RG

数字和后面字母之间的空格数通常为一,但可能是可变的

我有一个例子,那就是寻找组,但是我如何去掉替换中的空格呢

这是我尝试生成的代码

$re = '/(\d+ +)(AB|DE|RG|DU)/m';
$str = '23 AB 5400 DE 68 RG
        33 DU 88 DE 8723 AB
        55    RG 76  AB  92 DE';
$subst = '\\1\\2';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;
试试正则表达式:
(\d+)(AB|DE|RG|DU)

试试正则表达式:
(\d+)(AB | DE | RG | DU)


您可以使用这个lookaround正则表达式:

$repl = preg_replace('/(?<=\d)\h+(?=\pL)/', '', $str);

您可以使用这个lookaround正则表达式:

$repl = preg_replace('/(?<=\d)\h+(?=\pL)/', '', $str);
你可以试试这个

$re = '/(\d+)\s+/';
$str = '23 AB 5400 DE 68 RG 33 DU 88 DE 8723 AB 55    RG 76  AB  92 DE';
$subst = '\\1\\2';

$result = preg_replace($re, $subst, $str);
print_r($result);
你可以试试这个

$re = '/(\d+)\s+/';
$str = '23 AB 5400 DE 68 RG 33 DU 88 DE 8723 AB 55    RG 76  AB  92 DE';
$subst = '\\1\\2';

$result = preg_replace($re, $subst, $str);
print_r($result);

另一个选择是:

\b\d+\K\h+(?=(?:AB | DE | RG | DU))\b

单词边界之间的匹配
\b

  • \d+
    匹配1+个数字
  • \K
    忘记匹配的内容
  • (?=
    正向前瞻以断言右侧的内容
    • (?:AB | DE | RG | DU)
      与所列值之一匹配的替换
  • 关闭正向前瞻

并替换为空字符串:

$re = '/\b\d+\K\h+(?=(?:AB|DE|RG|DU))\b/';
$str = '23 AB 5400 DE 68 RG';
$result = preg_replace($re, '', $str);
echo $result; // 23AB 5400DE 68RG

另一个选择是:

\b\d+\K\h+(?=(?:AB | DE | RG | DU))\b

单词边界之间的匹配
\b

  • \d+
    匹配1+个数字
  • \K
    忘记匹配的内容
  • (?=
    正向前瞻以断言右侧的内容
    • (?:AB | DE | RG | DU)
      与所列值之一匹配的替换
  • 关闭正向前瞻

并替换为空字符串:

$re = '/\b\d+\K\h+(?=(?:AB|DE|RG|DU))\b/';
$str = '23 AB 5400 DE 68 RG';
$result = preg_replace($re, '', $str);
echo $result; // 23AB 5400DE 68RG

除非我遗漏了什么,否则忽略数字,将任何非数字替换为前面的空格,并使用相同的文本替换为不带空格的文本似乎是不错的

$result = preg_replace('/\s+(\D+)/', '$1', $string);

i、 e.匹配任何类似于
“AB”
的内容,并将其替换为
“AB”

除非我遗漏了什么,否则可以忽略数字,将任何非数字前面的空格替换为不带空格的相同文本

$result = preg_replace('/\s+(\D+)/', '$1', $string);

i、 e.匹配任何类似于
“AB”
,并将其替换为
“AB”

哦,是的,这很有意义。谢谢哦,是的,这很有道理。谢谢感谢所有回答的人。所有答案都非常有用,但我选择这个作为答案,因为这是处理我的特定用例的最佳方式。@SportsRacer我不是regex专家,所以就效率而言,这很可能不是最佳方式。我通常只是简单的目标。;-)在这种情况下,简单就是我所需要的!感谢所有回答的人。所有答案都非常有用,但我选择这个作为答案,因为这是处理我的特定用例的最佳方式。@SportsRacer我不是regex专家,所以就效率而言,这很可能不是最佳方式。我通常只是简单的目标。;-)在这种情况下,简单就是我所需要的!