我只需要從任何 URL 中提取檔案名。我查看了關于 URL 和檔案名的所有先前關于 stackoverflow 的答案,但沒有人考慮過檔案名帶有轉義字符的情況。
例如,我有一個這樣的 URL:
https://content.com/pbpython.py/notebooks/thirsty-allies.mov?file=The Big Kahuna.webm.tar.gz&f=Crosstab Explained.ipynb&a=b&m=plok 2001.tar.gz
我嘗試了很多RegEx,最后找到了一個遇到轉義字符時沒有拆分檔案名的:
"(?:\w*:\/\/)?((?:[\w-_]*\.?) :?\d*(?:\/?[\w-_.] \/?)*)[\?]?[\&]?([\w-_]*)?=?([\/\w-_\?\)%\.\(\*\[\]\^<>\\]*)?[\&]?([\w-_]*)?=?([\/\w-_\?\)%\.\(\*\[\]\^<>\\]*)?[\&]?([\w-_]*)?=?([\/\w-_\?\)%\.\(\*\[\]\^<>\\]*)?[\&]?([\w-_]*)?=?([\/\w-_\?\)%\.\(\*\[\]\^<>\\]*)?"g
你可以在這里測驗它:https ://regex101.com/r/LRWlif/7
結果一團糟:
match,group,is_participating,start,end,content
1,0,yes,0,148,https://content.com/pbpython.py/notebooks/thirsty-allies.mov?file=The Big Kahuna.webm.tar.gz&f=Crosstab Explained.ipynb&a=b&m=plok 2001.tar.gz
1,1,yes,8,60,content.com/pbpython.py/notebooks/thirsty-allies.mov
1,2,yes,61,65,file
1,3,yes,66,94,The Big Kahuna.webm.tar.gz
1,4,yes,95,96,f
1,5,yes,97,123,Crosstab Explained.ipynb
1,6,yes,124,125,a
1,7,yes,126,127,b
1,8,yes,128,129,m
1,9,yes,130,148,plok 2001.tar.gz
2,0,yes,148,148,
2,1,yes,148,148,
2,2,yes,148,148,
2,3,yes,148,148,
2,4,yes,148,148,
2,5,yes,148,148,
2,6,yes,148,148,
2,7,yes,148,148,
2,8,yes,148,148,
2,9,yes,148,148,
唯一的好處是檔案名都以某種方式匹配,沒有拆分部分,除了“thirsty-allies.mov”沿著一些 url 部分匹配。
還有一個問題是并非所有轉義字符都可以成為檔案名的一部分。例如,/ 是在路徑中分隔檔案夾的“/”,不應將其視為匹配的一部分。
例如:
https://www.contoso.com/sites/marketing/documents/Shared Documents/Forms/AllItemA.aspx?RootFolder=/sites/marketing/documents/Shared Documents/PFProduct Promotion 2001.docx&FolderCTID=0x012000F2A09653197F4F4F919923797C42ADEC&View={CD527605-9A7A-448D-9A35-67A33EF9F766}
使用相同的 RegEx,我們得到以下結果:
match,group,is_participating,start,end,content
1,0,yes,0,288,https://www.contoso.com/sites/marketing/documents/Shared Documents/Forms/AllItemA.aspx?RootFolder=/sites/marketing/documents/Shared Documents/PFProduct Promotion 2001.docx&FolderCTID=0x012000F2A09653197F4F4F919923797C42ADEC&View={CD527605-9A7A-448D-9A35-67A33EF9F766}
1,1,yes,8,56,www.contoso.com/sites/marketing/documents/Shared
1,2,yes,56,56,
1,3,yes,56,99, Documents/Forms/AllItemA.aspx?RootFolder
1,4,yes,99,99,
1,5,yes,100,188,/sites/marketing/documents/Shared Documents/PFProduct Promotion 2001.docx
1,6,yes,189,199,FolderCTID
1,7,yes,200,240,0x012000F2A09653197F4F4F919923797C42ADEC
1,8,yes,241,245,View
1,9,yes,246,288,{CD527605-9A7A-448D-9A35-67A33EF9F766}
2,0,yes,288,288,
2,1,yes,288,288,
2,2,yes,288,288,
2,3,yes,288,288,
2,4,yes,288,288,
2,5,yes,288,288,
2,6,yes,288,288,
2,7,yes,288,288,
2,8,yes,288,288,
2,9,yes,288,288,
如您所見,要匹配的檔案名是:
PFProduct Promotion 2001.docx
但正則運算式匹配:
/sites/marketing/documents/Shared Documents/PFProduct Promotion 2001.docx
我怎樣才能只得到檔案名而沒有別的?
uj5u.com熱心網友回復:
沒有標記語言,但如果你知道你總是有你可能使用的 url
(?<=[=\/]|%2F)(?:(?!%2F)[^?&\s\/]) \.\w (?=[?&]|$)
解釋
(?<=正向向后看,斷言當前位置左邊是什么[=\/]匹配=或/|或者/從字面上匹配
)關閉后視(?:非捕獲組(?!/)[^?&\s\/]/如果不直接位于當前位置的右側,則匹配字符類中未列出的字符以外的 1 個字符
)關閉非捕獲組并重復1 次\.\w匹配一個點和 1 個或多個單詞字符(?=[?&]|$)正向前瞻,直接在當前位置的右側斷言?或或字串的結尾&
正則運算式演示
其他變體
或者如果后視在不固定寬度的情況下不起作用,則使用捕獲組:
(?:[=\/]|/)((?:(?!/)[^?&\s\/]) \.\w )(?=[?&]|$)
正則運算式演示
在支持后向無限量詞的語言中:
(?<=https?:\/\/\S*(?:[=\/]|%2F))(?:(?!%2F)[^?&\s\/]) \.\w (?=[?&]|$)
正則運算式演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496162.html
