我也不敢保證這是在任何情況下一個防彈解決方案,但你可以嘗試在這個路徑上的每個字符懂事過濾:
- 點
.
用反斜槓點\.
- 螞蟻明星
*
用等效[^\/]+
- 螞蟻雙星
**
用正則表達式風格.*
- 斜線
/
逃脫\/
(這僅適用於Unix類路徑)
- 問號
?
用一字單字符\w
(這僅匹配[a-zA-Z0-9_]
可以比對於字符操作系統」規則允許的文件名更嚴格)
這是相關代碼:
#!/usr/bin/python
import re
star = r"[^\/]+"
doubleStar = r".*"
slash = r"\/"
questionMark = r"\w"
dot = r"\."
antPath = "foo/*/bar/**.ex?"
expectedPath = r"foo\/[^\/]+\/bar\/.*\.ex\w"
# Apply transformation
output = antPath.replace(r"/", slash).replace(r".", dot)
output = re.sub(r"(?<!\*)\*(?!\*)", star, output)
output = output.replace(r"**", doubleStar)
output = output.replace(r"?", questionMark)
if (output == expectedPath):
print "Success!"
else:
print "Failure..."
print "filteredPath: ", output
print "expectedPath: ", expectedPath
在線試玩here
要知道,「Unix的文件名模式匹配」和「正則表達式」是兩個d不同的事情。諸如'**/CVS/*'這樣的Ant風格模式在概念的「Unix文件名模式匹配」一側比在「正則表達式」一側更多。也許從你的搜索中刪除「正則表達式」將幫助你找到一個有用的庫? –
@MartinMelka:沒有運氣與我的路徑翻譯正則表達式? –
是的,我一直在玩類似的遊戲,但是你的解決方案似乎無論我能想到什麼都能正確匹配。我會做更多的測試:) –