正则表达式,去掉字母之间的句点


regex to strip periods between letters

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

使用regex可以做到这一点吗?我不知道如何成功地做到这一点,使用用空格替换句点的简单方法会打乱版本号的外观。

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

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

以及作为替换的空间。

或更激进的:

$pattern = '~(?<='D)'.|'.(?='D)~';

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

(?<='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

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

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

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

如果其中一个匹配,那么我们知道句点没有被数字包围,我们可以替换它。因为我们使用的是lookahead和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