2010-08-24 77 views
0

我想用$替換類[A-Za-z0-9_]之前的所有空白。替代正則表達式

$string = "STRING sDir = sDrive"; 
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/; 

它只是一個時間匹配,並且產生:

STRING $sDir = sDrive; 
+0

可以使用\'的替代w' '[A-ZA-Z0-9_]'。 – 2010-08-24 14:40:51

+3

@eugene不,你不能使用'\ w'作爲'[A-Za-z0-9_]'的同義詞。如果你的意思是'\ w',那麼使用'\ w'。如果你的意思是'[A-Za-z0-9_]',那麼使用'[A-Za-z0-9_]'。 – 2010-08-24 14:46:23

+0

雖然,如果你知道你正在處理ascii,你可以。 – muhmuhten 2010-08-24 14:47:42

回答

2

可以使用g標誌的正則表達式:

$string = "STRING sDir = sDrive"; 
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/g; 

這樣s///將適用於您的模式的每一場比賽。

默認的Perl行爲是執行替換一次。

g標誌告訴它執行每次出現的替換。

+1

這將用「空格」替換製表符,換行符和其他空格,所以要小心。或者用's /(\ s)(?= [A-Za-z0-9 _])/ $ 1 \ $/g'替換正則表達式。你也可以嘗試'/(?<= \ s)(?= [A-Za-z0-9 _])/ \ $/g'。兩者都未經測試,但前者應該可以肯定。 – manixrock 2010-08-24 14:47:50

+0

對,我專注於重複的事​​情。 – benzebuth 2010-08-24 15:03:19

+0

謝謝。這工作得很好。 – Dorian06 2010-08-24 18:06:38

3

要匹配多次,使用/ g標誌:

$string = "STRING sDir = sDrive"; 
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/g; 
0

如果我認爲你的意思你的意思是:

s/\s+\b/ \$/g; 

之前(這樣' a' - >' $a')這將刪除所有的空格和\ b爲要麼(?=(?<=\W)\w)(?=(<=\w)\W_的斷言; \ s總是\W[a-zA-Z0-9_]匹配\w的通用定義,所以它匹配您的(?=[...])

(當然,如果你正在處理的字符集,其中\w是不一樣的[a-zA-Z0-9],你必須替換爲\b的斷言。)