2012-12-15 51 views

回答

3

不要試圖對濫用正則表達式的一切。

通過設計,正則表達式旨在不支持計數。原因很簡單:如果你想要這樣做,至少需要一種2型語言,而處理比3型(「常規」)語言更加複雜。

請參見維基百科的細節:https://en.wikipedia.org/wiki/Chomsky_hierarchy

因此,通過定義,一旦你完全支持計數,它可能不再是一個普通的語言。

有擴展名,例如perl擴展正則表達式,可以解決這個問題。但實質上,它們不再是正則表達式,而是調用一個外部函數來完成這項工作。

以下perl的擴展正則表達式應該做你想要什麼:

s/(-?\d+)/$1 + 1/eg 

但實質上,只有匹配的部分是一個正則表達式,置換的Perl,所以圖靈完備。 e標誌表示正確的部分應該由Perl評估,而不是正則表達式替換字符串。

你當然可以在任何其他正則表達式引擎中做這個技巧。匹配,然後計算增量,然後用新值替換匹配。

完整的perl濾波器演示:

> echo 'Test 123 test 0 Banana9 -17 3 route66' | perl -pe 's/(-?\d+)/$1+1/eg' 
Test 124 test 1 Banana10 -16 4 route67 

p標誌使perl的讀標準輸入和程序應用到每個行,然後輸出結果。這就是爲什麼實際腳本只包含替換。這就是Perl對於unix腳本非常流行的原因。您甚至可以將此過濾器批量應用於一整套文件(請參閱-i進行就地修改,以及perlrun手冊頁)。因此,爲了修改整套文件的到位(備份將與.bak後綴):

perl -p -i .bak -e 's/(-?\d+)/$1+1/eg' <filenames> 
+0

感謝您對這樣的事事。 – SemihY