正则表达式从字符串中删除句点/ fullstops但不从内部数字中删除

时间:2014-03-09 22:33:24

标签: php regex

我正在寻找一个正则表达式来从字符串中删除句点/句点,但不是从内部数字中删除并用空格替换

$str1 = 'some.text.1.2.3.more.text';
$str2 = preg_replace('/(?<!\d)[._](?![._\d])/', ' ', $str1);

以上片段几乎完成了这项工作,但未能删除导致字符串为的数字之前的第一个句点/ fullstop: some text.1.2.3 more text 但我想要 some text 1.2.3 more text

3 个答案:

答案 0 :(得分:3)

你快到了。您想要的是替换前面没有数字或不后跟一个的点/下划线:

$str2 = preg_replace('/((?<!\d)[._])|([._](?![._\d]))/', ' ', $str1);

答案 1 :(得分:1)

使用这个。它在替换字符之前在左边或非数字处寻找非数字。

$str2 = preg_replace('/(?<=\D)[._]|[._](?=\D)/', ' ', $str1);

答案 2 :(得分:1)

另一种方法:

$str2 = preg_replace('~\d[._\d]*\d(*SKIP)(?!)|[._]~', ' ', $str1);

由于(?!) (一个总是错误的断言),第一部分总是失败,(*SKIP)回溯控制动词强制正则表达式引擎不重试之前匹配的子字符串