2011-05-11 53 views
2

我試圖在我的移動應用程序(用紅寶石書寫)中做鏈接重寫。我想它能夠與一個正則表達式來完成這兩個重寫:添加文字的正則表達式替換

m.example.com -> www.example.com 
m.subd.example.com -> subd.example.com 

我已經得到的最接近的替代這樣的:

m\.([a-z\.]*)example\.com 

與此:

$1example.com 

這適用於m.subd.example.com,但由於我的「www」而導致m.example.com失敗。例外。

我這樣做很多,所以我希望它非常快,這就是爲什麼我試圖避免使用任何代碼,只是一個正則表達式。可能嗎?有沒有我不知道的正則表達式的奇特功能?

+0

正則表達式不具有* translation *(即m - > www)。所以我認爲你需要兩個。但是,我很好奇看到一些答案。 – 2011-05-11 20:53:23

+0

這當然是可以做到的。但是如果你想將這兩者結合起來,我必須知道你使用的是什麼語言? (你可以將匹配傳遞給某些語言的函數) – 2011-05-11 21:06:10

+0

我希望在ruby和javascript中都這樣做,所以討論任何一個都是值得歡迎的。 – Andrew 2011-05-11 21:46:32

回答

0

我試圖避免使用任何代碼,只是一個單一的正則表達式

正則表達式是代碼。更復雜的正則表達式需要更長的時間才能運行。您需要編寫一些代碼或運行兩個正則表達式。

result = subject.gsub(/m\.([a-z.]*)example\.com/, '\1example.com').gsub(/^example\.com/, 'www.example.com') 
+0

選擇正確的答案,謝謝Jeremy。不幸的是,我的問題的真正答案似乎是「這是不可能的」。 – Andrew 2012-06-16 01:19:52

0

我不知道Ruby,但是這裏有一個Perl腳本,可以爲你給出的例子做這個工作。可能是它可以被翻譯。

#!/usr/local/bin/perl 
use strict; 
use warnings; 

my @list = qw/m.example.com m.subd.example.com/; 
my $re = qr#^m\.(.*)(example\.com)$#; 
foreach(@list) { 
    print $_; 
    s/$re/($1 || "www.") . $2/e; 
    print " -> $_ \n"; 
} 

輸出:

m.example.com -> www.example.com 
m.subd.example.com -> subd.example.com