我也不敢保证这是在任何情况下一个防弹解决方案,但你可以尝试在这个路径上的每个字符懂事过滤:
- 点
.
用反斜杠点\.
- 蚂蚁明星
*
用等效[^\/]+
- 蚂蚁双星
**
用正则表达式风格.*
- 斜线
/
逃脱\/
(这仅适用于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:没有运气与我的路径翻译正则表达式? –
是的,我一直在玩类似的游戏,但是你的解决方案似乎无论我能想到什么都能正确匹配。我会做更多的测试:) –