Regex删除非数字字符,但不删除字符串开头的字符


Regex to remove non-numeric characters but not at the beginning of a string

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

一个OK字符串遵循以下模式:

^(SI?)?'d+$

例如:SI234965305843453

如果我给它一个字符串:S234---9Sptreccc6543453则CCD_ 4应返回:

S23496543453

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

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

RegEx演示

'D+之前的(.)将确保'D+在开始时不匹配。

您可以尝试以下基于反向查找的regex来匹配所有非数字字符,但不能匹配开头的字符。

(?<!^)'D

(?<!^)否定查找,它断言要匹配的字符前面不会有行锚的开头。

演示

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

演示