2013-10-30 68 views
2

我想解析文件中的URL。我的正則表達式正在工作80%的時間,但我需要修改它的例外情況。它開始變得複雜了,我想知道如何爲這個輸入文件編寫一個很好且乾淨的正則表達式來獲得一個組中的主機,並在一秒之內獲得URI部分。C#正則表達式優化

例如:http://stackoverflow.com/index.php其中stackoverflow.com是主機,/index.php是URI。

輸入文件:

//cdn.sstatic.net/stackoverflow/img/favicon.ico 
//cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png 
/opensearch.xml 
/
# 
http://www.stackoverflow.com 
http://www.stackoverflow.com/ 
http://stackoverflow.com/ 
http://careers.stackoverflow.com 
aaa#aaa.com 
aaa.com#aaa 
aaa#aaa 
#aaa 
# 
fakedomain/index.php 
fakedomain.com/index.php 
fakedomain.com/ 
/fakedomain.com/ 
/index.html/ 
index.html 

正則表達式:

(?:.*?//)?(.*?)(/.*|$) 

結果:

1 : //cdn.sstatic.net/stackoverflow/img/favicon.ico has 2 groups: 
    cdn.sstatic.net 
    /stackoverflow/img/favicon.ico 

2 : //cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png has 2 groups: 
    cdn.sstatic.net 
    /stackoverflow/img/apple-touch-icon.png 

3 : /opensearch.xml has 2 groups: 
    /opensearch.xml 

4 :/has 2 groups: 

    /

5 : http://www.stackoverflow.com has 2 groups: 
    http: 
    //www.stackoverflow.com 

6 : http://www.stackoverflow.com/ has 2 groups: 
    www.stackoverflow.com 
    /

7 : http://stackoverflow.com/ has 2 groups: 
    stackoverflow.com 
    /

8 : http://careers.stackoverflow.com has 2 groups: 
    http: 
    //careers.stackoverflow.com 

7 : fakedomain/index.php has 2 groups: 
    fakedomain 
    /index.php 

8 : fakedomain.com/index.php has 2 groups: 
    fakedomain.com 
    /index.php 

9 : fakedomain.com/ has 2 groups: 
    fakedomain.com 
    /

10 : /fakedomain.com/ has 2 groups: 

    /fakedomain.com/ 

11 : /index.html/ has 2 groups: 

    /index.html/ 

12 : index.html has 2 groups: 
    index.html 

13 : has 2 groups: 

C#正則表達式測試儀:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

那麼我怎樣才能刪除與.ico.png的鏈接,並添加一些其他修復,並獲得一個很好,乾淨的正則表達式?

回答

7

正則表達式是一個非常靈活的工具,但對於任何形式的標準化格式,幾乎總是有一個標準的解析器,可以更快,更好地完成工作。

使用System.Uri(http://msdn.microsoft.com/en-us/library/system.uri.aspx)將爲您處理所有的角落案例。

+0

我同意你的一般方法,但是在這種情況下'System.Uri'是錯誤的,它需要一些努力來破解它。考慮在URL中使用'%2F'字符 - 你必須自己修復它。 – greenoldman

+0

感謝您的提示,但我想自己編寫它。如果要加速應用程序,我不介意在ASM中編寫代碼。所以如果正則表達式不是那種採取的方式? Thx再次 – Naster

+0

greenoldman:它是越野車嗎?還是需要通過衆多的Uri類方法確保輸入是正確的未轉義? Naster:如果你想要一個正確的解析器,它可以與任何你遇到的uri一起工作,而不僅僅是你期望的那些,你需要使用System.Uri。或者您可以使用http://tools.ietf.org/html/rfc3986作爲參考創建自己的實現。 –