2013-07-05 72 views
0

我一直在試圖在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

嘗試這樣的模式:/\.(?![0-9])|(?<![0-9])\./,並與' '

在代碼替換,這將是這樣的:

$filename = preg_replace('/\.(?![0-9])|(?<![0-9])\./', ' ', $filename); 
  1. 基本上,我們正在尋找兩個選項/something|something/
  2. 第一個選項是一個數字後面沒有的時間段。我們使用負向前瞻來檢查這個問題:\.(?![0-9])
  3. 第二個選項是一個沒有數字的時期。對此,我們使用負反向:(?<![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 
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 
4

您可以使用該圖案的preg_replace:

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

,並作爲替代空間。

或多種自由基:

$pattern = '~(?<=\D)\.|\.(?=\D)~'; 
相關問題