Objective-C的路径匹配库。
概述
#import "ATPathSpec.h"
ATPathSpec *spec = [ATPathSpec pathSpecWithString:@"docs/*.txt" syntaxOptions:ATPathSpecSyntaxFlavorExtended];
BOOL matched = [spec matchesPath:@"docs/README.txt" type:ATPathSpecEntryTypeFile];
语法风味
ATPathSpecSyntaxFlavorLiteral
:字面字符串(没有特殊字符)ATPathSpecSyntaxFlavorGlob
:shell样式glob,支持 *
和 ?
通配符ATPathSpecSyntaxFlavorGitignore
:100%与 .gitignore
兼容ATPathSpecSyntaxFlavorExtended
:启用所有ATPathSpec功能;请注意,它与gitignore不完全兼容,因为它设置了 ATPathSpecSyntaxOptionsRequireTrailingSlashForFolders
标志语法特性(通过语法风味或单独的特性标志启用)
*
表示任意数量的文件名字符(ATPathSpecSyntaxOptionsAllowStarWildcard
)?
表示恰好一个文件名字符(ATPathSpecSyntaxOptionsAllowQuestionMarkWildcard
)ATPathSpecSyntaxOptionsAllowBackslashEscape
):\!important.txt
ATPathSpecSyntaxOptionsAllowNewlineSeparator
,ATPathSpecSyntaxOptionsAllowCommaSeparator
,ATPathSpecSyntaxOptionsAllowWhitespaceSeparator
):*.txt, *.html, !*READ*, README.txt
*.txt | *.html | (*.xml & !*build*)
*.txt & !*READ*
foo & (bar | boz)
*.txt & !README.*
*.html # HTML files
foo/
来仅匹配文件夹(不可配置)。foo
来仅匹配文件(如果 `ATPathSpecSyntaxOptionsRequireTrailingSlashForFolders
被指定)或匹配文件和文件夹(如果该标志未指定)ATPathSpecSyntaxOptionsMatchesAnyFolderWhenNoPathSpecified
` 标志被设置,则模式匹配在任何子文件夹中(类似于gitignore);否则,如果没有设置此标志,此类模式仅在根文件夹中匹配。.git/ | .svn/
之类的规范将匹配.git/foo/bar
。当您使用换行符、逗号或空格分隔符与感叹号否定一起使用时,生成的规范遵循gitignore的语义,可以概括为“最后一个匹配的条目获胜”。也就是说:
*.txt
*.html
!*READ*
README.txt
匹配任何文本或HTML文件,除了包含READ
字样但可以匹配到README.txt。
在内部,这样的列表会转换为:
((*.txt | *.html) & !*READ*) | README.txt
这就是您在调用返回路径规范对象上的description
方法时将会得到的结果。
这适用于换行符分隔、逗号分隔和空格分隔的列表。
没有运算符优先级;如果没有括号,您不能在同一个表达式中混合不同的运算符。
(我非常希望自动将换行符分隔的表达式包裹在括号中,这样换行符就是唯一具有更低优先级的运算符,但我还没有做到这一点。目前,您不能将换行符、逗号和空格分隔符与其他任何运算符混合使用。)
扩展模式启用了所有语法功能,因此您可以编写以下内容:
(*.txt *.html *README* !docs/*.txt) & !(~* | *.tmp)
请记住,扩展模式启用了ATPathSpecSyntaxOptionsRequireTrailingSlashForFolders
,所以.git
不会匹配git子文件夹,您需要使用.git/
。
与其他力求与现有API兼容的版本不同,扩展模式将在库中添加新功能时累积功能。
MIT许可证;请参阅LICENSE文件。