我一直在尝试搜索stackoverflow并通过谷歌如何剥离所有。来自字符串的(句点),除了数字之间。到目前为止,我没有运气。
我有一堆文件名,如:
this.is.a.file.1233
another.cool.file.v1.2.3
oh.wow.this.file.again.v1.2.4
guess.what.v1.2.3.is.now.out
但是我想将它们显示为:
this is a file 1233
another cool file v1.2.3
oh wow this file again v1.2.4
guess what v1.2.3 is now out
这可以使用正则表达式吗?我无法弄清楚如何成功地做到这一点,并使用一个简单的方法用空格替换句点会弄乱版本号的外观。
答案 0 :(得分:4)
您可以将此模式与preg_replace:
一起使用$pattern = '~(?<=[a-z])\.|\.(?=[a-z])~i';
和替换空间。
或更激进:
$pattern = '~(?<=\D)\.|\.(?=\D)~';
答案 1 :(得分:2)
您可以在此处使用断言来匹配句点,这些句点表明在句号之前或之后必须出现至少一个非数字字符:
(?<=\D)\.|\.(?=\D)
您可以在PHP中使用它:
$str = preg_replace( '/(?<=\D)\.|\.(?=\D)/', ' ', $str);
你可以从this demo看到这打印:
this is a file 1233
another cool file v1.2.3
oh wow this file again v1.2.4
guess what v1.2.3 is now out
答案 2 :(得分:0)
尝试这样的模式:/\.(?![0-9])|(?<![0-9])\./
,并替换为' '
在代码中,看起来像这样:
$filename = preg_replace('/\.(?![0-9])|(?<![0-9])\./', ' ', $filename);
/something|something/
。\.(?![0-9])
(?<![0-9])\.
如果两者匹配,那么我们就知道这个时期没有被数字包围,我们可以替换它。因为我们使用前瞻和后瞻,所以它只是实际匹配的时期,我们可以用一个空格替换它。
根据您的示例,这将产生以下内容:
this is a file 1233
another cool file v1.2.3
oh wow this file again v1.2.4
guess what v1.2.3 is now out