正则表达式去除字母之间的句号

时间:2013-07-05 03:07:00

标签: php regex

我一直在尝试搜索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

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

3 个答案:

答案 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);
  1. 基本上,我们正在寻找两个选项/something|something/
  2. 第一个选项是一个未跟随数字的句点。我们使用否定前瞻来检查:\.(?![0-9])
  3. 第二个选项是一个不以数字开头的句号。我们使用负面的lookbehind:(?<![0-9])\.
  4. 如果两者匹配,那么我们就知道这个时期没有被数字包围,我们可以替换它。因为我们使用前瞻和后瞻,所以它只是实际匹配的时期,我们可以用一个空格替换它。

    根据您的示例,这将产生以下内容:

    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