2008-08-17 26 views
4

我讀this question如何解析網址從網頁,有一個關於它提供該解決方案的accepted answer問題:目的{1}在這個正則表達式匹配的URL協議

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+) 

解決方案由csmba提供,並且他將其記入regexlib.com。呼。完成的信用。

我認爲這是一個相當天真的正則表達式,但它是構建更好的東西的良好起點。但是,我的問題是這樣的:

{1}是什麼意思?它意味着「恰好是以前的一個分組」,對嗎?這不是正則表達式中分組的默認行爲嗎?如果{1}被刪除,表達式是否會以任何方式更改?

如果我從一位同事那裏看到了這個,我會指出他或她的錯誤,但是當我寫這篇文章的時候,回覆的評分爲6分,而regexlib.com上的表達評分爲5分。遺漏了什麼?

回答

1

@Jeff Atwood,你的解釋有點不合理 - {1}意味着匹配一次,但對「捕獲」沒有影響 - 捕獲是由於parens發生的 - 花括號僅指定次數該模式必須與來源相匹配 - 就像你說的那樣。

我同意@Marius,即使他的回答有點簡潔,並且可能會成爲浮誇。正則表達式很難,如果不習慣使用它們,並且問題中的{1}不是很錯誤 - 在支持它的系統中,它確實意味着「完全匹配」。從這個意義上說,它並沒有真正做任何事情。

不幸的是,相反到現在刪除的帖子,它不守正則表達式的匹配http://http://example.org,因爲在最後的\ S +將匹配一個或多個非空白字符,包括在http://http://example.orghttp://example.org(驗證使用Python 2.5,以防萬一我的正則表達式讀取關閉)。所以,給出的正則表達式並不是最好的。我不是URL專家,但可能會限制「:」和「//」出現後的第一個必要(但很難),以確保良好的URL。

2

我不認爲它有任何目的。但是因爲RegEx幾乎不可能理解/分解,所以人們很少指出錯誤。這可能是沒有人指出的原因。

3

@Rob:我不同意。爲了執行你所要求的內容,我認爲你需要使用負面後視,這是可能的,但與使用{1}無關。這兩個版本的regexp地址都沒有特別的問題。

爲了讓代碼說話:

tibook 0 /home/jj33/swap > cat text 
Text this is http://example.com text this is 
Text this is http://http://example.com text this is 
tibook 0 /home/jj33/swap > cat p 
#!/usr/bin/perl 

my $re1 = '((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)'; 
my $re2 = '((mailto\:|(news|(ht|f)tp(s?))\://)\S+)'; 

while (<>) { 
    print "Evaluating: $_"; 
    print "re1 saw \$1 = $1\n" if (/$re1/); 
    print "re2 saw \$1 = $1\n" if (/$re2/); 
} 
tibook 0 /home/jj33/swap > cat text | perl p 
Evaluating: Text this is http://example.com text this is 
re1 saw $1 = http://example.com 
re2 saw $1 = http://example.com 
Evaluating: Text this is http://http://example.com text this is 
re1 saw $1 = http://http://example.com 
re2 saw $1 = http://http://example.com 
tibook 0 /home/jj33/swap > 

所以,如果有兩個版本之間的差異,它似乎並不爲你建議的人。

2

我不認爲{1}在該正則表達式中有任何有效的函數。

(**的mailto:|?(新聞|(HT | F)TP(S))://){1} **

你應該讀這爲:「一次性捕獲父母的東西「。但我們並不真正關心如何在以後使用它,例如更換中的$ 1。所以這沒有意義。