正则表达式删除非数字字符但不删除字符串的开头

时间:2015-03-24 14:39:09

标签: php regex

我需要构造一个正则表达式(preg_replace)来从字符串中删除所有非数字字符,但如果它们在开头出现则不需要。我通常非常擅长构建正则表达式,但这个让我感到沮丧。

一个好的字符串遵循这种模式:

^(SI?)?\d+$

例如:SI234965305843453

所以,如果我给它这个字符串:S234---9Sptreccc6543453 那么preg_replace应该返回:

S23496543453

2 个答案:

答案 0 :(得分:3)

如果没有预测,您可以使用这个简单的匹配组和反向引用:

$str = preg_replace('/(.)\D+/', '$1', $str);
//=> S23496543453

RegEx Demo

(.)之前

\D+将确保\D+在开始时不匹配。

答案 1 :(得分:1)

您可以尝试使用以下基于负面lookbehind的正则表达式匹配所有非数字字符,但不能匹配开头的字符。

(?<!^)\D

(?<!^)负面的后视,断言要匹配的字符不会在行锚的开头之前。

DEMO

echo preg_replace('~(?<!^)\D~', '', 'S234---9Sptreccc6543453');
//=> S23496543453

<强>更新

仅对以SSI开头的行进行替换。

$str = <<<EOT
SI234965305843453
S234---9Sptreccc6543453
5492353ffsdkfjsd5345
EOT;
echo preg_replace('~((?:^SI?|\G)\d*)[^\n\d]~m', '\1', $str);

<强>输出:

S234965305843453
S23496543453
5492353ffsdkfjsd5345

DEMO