2012-10-26 58 views
0

我正在尋找一種方式,將整數和連字符串中的任何單個數字與0相加。用正則表達式匹配並替換一個數字?

「-0-2-3 --- --- 12-0 10-」 變得 「-00-02-03 --- --- 12-00 10」

「-12-14-7-8-」 變得 「-12-13-07-08-」

我使用\ d試圖{1}以破折號,但它的組合似乎沒有捕獲所有正確的部分。任何幫助將不勝感激。如果一個正則表達式太複雜了,就不要這麼說,碰巧寫一個某種類型的遍歷器。

感謝

回答

3

如果正則表達式引擎支持lookaround斷言,那麼這是一種方法:

s/(?<!\d)(?=\d(?!\d))/0/g 

如果正則表達式引擎不支持後向斷言(例如, JavaScript的),則:

s/(^|[^\d])(?=\d(!\d))/$10/g 

如果正則表達式引擎不支持環視斷言的話,那麼:

s/(^|[^\d])(\d)([^\d])/$10$2$3/g 
+0

不能在我的控制檯與sed ...(我確實轉義括號並將$改爲\) – alestanis

+0

一個在Ruby中發揮了魅力。速度對我來說不是問題,所以非常好,謝謝 – redroot89

+0

@alestanis - 我相信''sed''需要處於Perl模式(''-R'')才能使周圍的斷言生效。沒有周身的斷言,這個任務在單個替換中是不可能的。 –

2

我會使用類似

s/-\([0-9]\)-/-0\1-/g 

這不會對鄰近單號工作,但如果你運行它兩次,所有的數字都陷入:

Alejandra:~$cat tmp.txt 
-12-14-7-8-2-13-1-5-3-4-7- 
Alejandra:~$sed "s/-\([0-9]\)-/-0\1-/g" tmp.txt | sed "s/-\([0-9]\)-/-0\1-/g" 
-12-14-07-08-02-13-01-05-03-04-07- 
+0

這並不讓相鄰的個位數字的條目很遺憾。對於第一個字符串(-0-2-3 --- 12-0 --- 10-),它只匹配-0-,-3-和-0-,而不是-2 – redroot89

+0

我剛剛注意到,我'試着用'sed'在我的控制檯上 – alestanis

+0

如果你運行它兩次,它會得到一切,雖然 – alestanis

相關問題