2013-07-25 21 views
4
每個字符一個空格替換模式

比方說,我想匹配正則表達式的URL:在Perl

$text = 'http://www.google.com/'; 
$text =~ /\bhttp:\/\/([^\/]+)/; 
print $1; # It prints www.google.com 

我想取代它同一個空間,它匹配每個字符的模式。例如,考慮上面的例子,我想結束這段文字:

# http://   /

有沒有簡單的方法來做到這一點?找出匹配圖案有多少個字符,並用相同數量的不同字符替換它?

謝謝。

+1

**這可能不是正則表達式的工作,而是使用您選擇的語言的現有工具。**正則表達式不是您碰巧涉及到字符串的每個問題的魔術棒。您可能想要使用已經編寫,測試和調試的現有代碼。 在PHP中,使用['parse_url'](http://php.net/manual/en/function.parse-url.php)函數。 Perl:['URI' module](http://search.cpan.org/dist/URI/)。 Ruby:['URI'' module](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html)。 .NET:['Uri'class](http://msdn.microsoft.com/en-us/library/txt7706a.aspx) –

+0

URL是一個例子。我真正需要知道的是如何用模式本身的許多字符替換一個模式。例如,這也可以用來掩蓋信用卡號碼或類似的東西(xxxxxxxxxxxx1234)。謝謝您的意見。 – calvillo

回答

6

一種簡單方式是:

$text =~ s!\b(http://)([^/]+)!$1 . " " x length($2)!e; 

的正則表達式\b(http://)([^/]+)字邊界,文字串http://,以及一個或多個非斜槓字符,在$2捕獲http://$1和非斜槓字符匹配。 (請注意,我使用!作爲正則表達式定界符上面,而不是通常/避免leaning toothpick syndrome。)

s///操作者的端部的e開關將導致該取代$1 . " " x length($2)爲Perl代碼代替被評估的是解釋爲一個字符串。它因此評估爲$1,後面跟着$2中有多少個字母。

+2

post-v10,你可以使用'\ K'正則表達式來避免不必要的捕獲:'\!\ bhttp:// \ K([^ /] +)!「」x length($ 1)!e'。這縮短了正則表達式。 – amon

+0

非常令人印象深刻!我甚至不知道存在「x」運算符。非常感謝你。 – calvillo