2015-11-10 69 views
1

我試圖縮短所有多個空間到一個空間,除了空間(縮進)的第一次發生。perl字符串替換的負面正則表達式

我發現這個代碼將替換第一個出現次數:

$_ =~ s/^ +/ /;

所以我想,它的否定會做我想做的。但事實並非如此:

$_ =~ s/!^ +/ /g;

我在做什麼錯?

回答

2

你可以改變的方法來正則表達式

s/\S\K +/ /g; 
+1

非空格,保留,後面跟一個或多個空格,用空格替換。 (和你保存的位)。我認爲?但一個很好的解決方案 – Sobrique

+0

不錯的主意,是或'(?<= \ S)+' –

+0

是的,\ K從v5.10和更新的版本看起來是積極的。 –

1

感嘆號在正則表達式中不是否定的。至少,不是那樣的。

你需要的是負回顧後:

s/(?<!^)\s+/ /g; 

應該做的伎倆。

+0

但這種去除新線的跡象(CRLF),以及... – lmocsi

+0

是的。它匹配任何空格。很容易,但更具選擇性。 – Sobrique