0

我一直在尝试在 stackoverflow 上搜索并通过 google 如何删除所有 . (句点)来自字符串,数字之间的位置除外。到目前为止,我没有运气。

我有一堆文件名,例如:

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

这可以使用正则表达式吗?我无法弄清楚如何成功地做到这一点,并且使用用空格替换句点的简单方法会弄乱版本号的外观。

4

3 回答 3

4

您可以将此模式与 preg_replace 一起使用:

$pattern = '~(?<=[a-z])\.|\.(?=[a-z])~i';

和一个空间作为替代。

或更激进的:

$pattern = '~(?<=\D)\.|\.(?=\D)~';
于 2013-07-05T03:20:26.697 回答
2

您可以在此处使用断言来匹配声明至少一个非数字字符必须出现在句点之前或之后的句点:

(?<=\D)\.|\.(?=\D)

你可以像这样在 PHP 中使用它:

$str = preg_replace( '/(?<=\D)\.|\.(?=\D)/', ' ', $str);

您可以从这个演示中看到,它会打印:

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
于 2013-07-05T03:14:24.840 回答
0

尝试这样的模式:/\.(?![0-9])|(?<![0-9])\./,并替换为' '

在代码中,它看起来像这样:

$filename = preg_replace('/\.(?![0-9])|(?<![0-9])\./', ' ', $filename);
  1. 基本上,我们正在寻找两种选择/something|something/
  2. 第一个选项是不带数字的句点。我们使用负前瞻来检查这一点:\.(?![0-9])
  3. 第二个选项是前面没有数字的句点。我们对此使用否定的lookbehind:(?<![0-9])\.

如果其中任何一个匹配,那么我们知道句点没有被数字包围,我们可以替换它。因为我们使用的是lookaheads 和lookbehinds,它只是实际匹配的时期,我们可以用一个空格替换它。

鉴于您的示例,这将产生以下内容:

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
于 2013-07-05T03:10:01.947 回答