我正在寻找一个正则表达式来从字符串中删除句点/句点,但不是从内部数字中删除并用空格替换
$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
答案 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)
回溯控制动词强制正则表达式引擎不重试之前匹配的子字符串