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