2010-05-13 46 views
2

我需要從Google Video URL獲取視頻ID。有兩種不同類型的網址,我需要能夠匹配:正則表達式匹配Google Video URL中兩個視頻ID之一

http://video.google.com/videoplay?docid=-3498228245415745977

,我需要能夠匹配-3498228245415745977(注意劃線; - )和

video.google.com/videoplay?docid=-3498228245415745977#docid=

我需要匹配2728972720932273543。有什麼好的正則表達式可以匹配嗎?

這是我到目前爲止:@"docid=(-?\d{19}+)"由於視頻ID似乎是19個字符,除非它的前綴是短劃線。

如果改變了什麼,我正在使用C#(其中我有很少經驗)。

P.s.我也很感謝您查看我的正則表達式YouTube(@"[\?&]v=([^&#])";),RedTube(@"/(\d{1,6})")和Vimeo(@"/(\d*)")。

我不希望用戶輸入完整的URL,因此與^http://\\.?sitename+\\.\\w{2,3}不匹配。

回答

2

下面這段正則表達式的採用的是所謂的負先行,以確保沒有在賽後的字符串的任何部分,包含#docid:

docid=(-?\d{19}(?!\#docid=)) 

(?!\#docid=)是負先行部分RegEx。如果您想了解更多關於它,你可以看看http://www.regular-expressions.info/lookaround.html

希望這有助於你

編輯: 如果你還沒有得到它,你應該從SourceForge得到"The Regulator 2.0"。它是正則表達式的設計和測試工具。當我開發正則表達式時,我發現它非常有幫助。

+0

我對負向預覽不熟悉,但該表達式是否與「video.google.com/videoplay?docid=-3498228245415745977#docid=2728972720932273543」的「2728972720932273543」(後者)部分匹配? – 2010-05-13 18:57:52

+1

是的。它與-3498228245415745977部分不匹配,因爲它後面緊跟着一個「#docid =」,所以它會跳過該部分,然後找到也與您的RegEx匹配的後一部分。 因此,負面超前的「唯一」事情就是確保比賽沒有遵循給定的表達。 – Falle1234 2010-05-13 19:13:12

+0

非常感謝,這個解決方案太棒了! – 2010-05-13 19:46:52

0

使用這種RE:

docid=-([0-9]*) 

結果

Array 
(
    [0] => docid=-3498228245415745977 
    [1] => 3498228245415745977 
) 

我用Java,PHP,awk的,perl的測試過它。