2014-09-23 53 views
0

這是我的例子。如果我想用正則表達式來替換代碼中的製表符並用空格,但希望在一行代碼的中間或末尾保留製表符,我會用它作爲我的搜索字符串,以便在開始時捕獲每個製表符一行:^(\t)+是否有一個正則表達式引擎支持替換字符串中的「爲每個捕獲的組」?

現在,我怎麼能寫一個搜索字符串,用四個空格替換每個捕獲的組?我在想一定有辦法用反向引用來做到這一點?

我發現我可以通過運行類似的正則表達式替換(如s/^\t/ /gs/^ \t/ /g,...)多次,直到沒有更多的匹配被發現,但我不知道是否有更快的方法來做所有的立即進行必要的更換。

注:我以前sed格式在我的例子,但我不知道這是可能的sed。我想知道sed是否支持這個功能,如果不支持,是否有一個平臺呢? (例如,有一個Python/Java/bash擴展正則表達式庫支持這一點)。

+3

「平臺無關」不與正則表達式存在。 – 2014-09-23 19:28:45

+0

您是否有任何您發佈的正則表達式尚未解決的問題? – murgatroid99 2014-09-23 19:29:07

+1

@CasimiretHippolyte你是對的;謝謝!我已更新我的問題 – CullenJ 2014-09-23 19:35:23

回答

2

使用perl和其他語言支持此功能(Java,PCRE(PHP,R,libboost),Ruby,Python正則表達式模塊),.NET),您可以使用的最後一場比賽或字符串的開始後的位置相匹配的\G錨:

s/(?:\G|^)\t/ /gm 
1

這個工作在Perl。也許sed也是,我不知道sed。
它依靠做一個評估,基本上是一個回調。
它需要$ 1的長度,然後貓' '多次。

Perl示例。

my $str = " 
\t\t\tThree 
\t\tTwo 
\tOne 
None"; 

$str =~ s/^(\t+)/ ' ' x length($1) /emg; 

print "$str\n"; 

輸出

  Three 
     Two 
    One 
None 
+0

這很酷。只要被替換的字符串是一個字符長度,它就會工作。 「x」是否乘以? – CullenJ 2014-09-23 20:26:38

+0

是的,這是Perl中的一個Multiply運算符,用於處理字符串。它像'for($ i = 0; $ i sln 2014-09-23 21:35:52

0

只是另一個是來找我的想法,這也可以用positive lookbehind解決:

s/(?<=^[\t]*)\t/ /gm 

它的醜陋,但它的工作原理。

+1

可變長度lookbehind在那裏的引擎的%99不支持,否則它會很好。 – sln 2014-09-23 21:31:17

0
sed ':a 
    s/^\(\t*\)\t/\1 /
    ta' YourFile 

使用遞歸行動1個正則表達式與SED,這是一個解決辦法