2009-11-02 49 views
1

我正試圖用文本正文中的X替換除價格(以$開頭的數字)之外的所有數字。我一直試圖用後面的眼光來完成這項工作,但似乎並不奏效。這裏是我現在使用的:匹配不是價格的數字

$comments = preg_replace("/(?<!$)([0-9]+)/", "x", $comments); 

這最終只是用X替換所有的數字,包括那些前面有$的。

+0

我試圖逃跑的美元符號,但問題仍然存在。 – Iainzor 2009-11-02 22:21:18

回答

3

您需要使用反斜線,\$美元符號,否則被解釋爲行/字符串的結尾。

而且,設置第二個括號是完全沒有必要 - 你不使用你捕獲組。

哦,爲了避免更換一些類似於$ 100的東西,您需要將0-9添加到您的負面後臺上...因爲您這樣做,您可以簡單地將美元放在角色類中,並且不需要轉義。

所以在這一點上,我們有:

$comments = preg_replace("/(?<![$0-9])[0-9]+/", "x", $comments); 

但顯然「的preg_replace不支持repition在向後看」 - 這是我要帶去意味着你不能把0-9的向後看,所以在它之前放置一個字邊界。

也未嘗避免被替換$ 9.99,所以希望我們可以指定\ d。在看後面禁止這一點。

所以,你的代碼最終變爲:

$comments = preg_replace("/(?<!\$|\d\.)\b[0-9]+\b/", "x", $comments); 


有了這一切增加了複雜性,你需要創建一些測試案例,以確保按預期工作。

+0

生產與以前相同。 – Iainzor 2009-11-02 22:19:04

+0

嗯...是的,我也想到了。我沒有發佈這個的原因是代碼仍然設法在發佈的解決方案中查找其他數字。 – Franz 2009-11-02 22:20:53

+0

請發佈您的輸入文本樣本 - 沒有理由失敗,除非您的貨幣值不是格式。 – 2009-11-02 22:21:23

2

$是在正則表達式一個特殊字符(表示字符串的末尾)。你需要逃避它:\$

也作爲目前的公式,你的lookbehind可能只會阻止它取代價格的第一位數;因爲在第一個數字之後,由於你不再是$,後向將繼續匹配。

你可能想使用的東西,包括\b(字邊界)來限制匹配的數字序列,以唯一全數字的開頭和結尾。

0

這應該也行:

/(?<=\s)[0-9]+/ 
+0

這個:'(?<= \ s)(?<!\ $)'沒有意義。如果後面的第一個字符'(?<= \ s)'匹配,第二個字符'(?<!\ $)'不可能匹配。 – 2009-11-02 23:00:53