Glob Patterns匹配模式使用
前段時間在用workbox時,在做precache時,匹配模式基于的是Glob Pattern模式,于是就看了下相關文檔。
下面翻譯一下node-glob的使用,原文:https://github.com/isaacs/node-glob#glob-primer
Glob
像在shell里面,用*等匹配模式來匹配文件。
Glob基于Javascript實現,使用minimatch庫進行匹配。
使用
使用npm安裝
npm i glob var glob = require("glob")// options可選 glob("**/*.js", options, function (er, files) {// files是匹配到的文件數組// 如果`options`中的`nonull`為true, 當未發現時, files返回["**/*.js"]// `er`是一個錯誤對象或者null })Glob 入門
"Glob"是一種模式,類似于在命令行中輸入ls *.js,或是在.gitignore文件中寫build/*。
在解析路徑模式時,大括號內使用逗號進行分隔,分隔部分可以包含/,所以a{/b/c,bcd}會被展開為a/b/c和abcd。
在匹配路徑使用時,以下字符有一些特殊的作用:
- *:匹配單路徑下的 0 個或 多個 字符串。
- ?:匹配一個字符串。
- [...]:匹配指定范圍內的字符串,類似于正則表達式中的[]。如果[]中的第一個字符串是!或者^,則匹配不在范圍內的任意字符串。
- !(pattern|pattern|pattern):匹配與提供模式中不匹配的內容。
- ?(pattern|pattern|pattern):匹配提供模式中的 0次 或 1次。
- +(pattern|pattern|pattern):匹配提供模式中的 1次 或 多次。
- *(a|b|c):匹配提供模式中的 0次 或 多次。
- @(pattern|pat*|pat?erN):匹配與提供模式中完全匹配的。
- **:和*一樣,可以匹配路徑中的 0個 或 多個,而且**可以匹配當前目錄和子目錄。但無法抓去符號鏈接的目錄。
.點
如果匹配的文件或目錄部分以.開頭,除非匹配的路徑也以.開頭,否則不會匹配任何模式。
例如 a/.*/c模式會匹配a/.b/c。然而a/*/c模式卻不會進行匹配,因為*并不是以.開始的。
你可以通過設置option dot:true,讓Glob把.做為正常字符串。
Basename的匹配
如果你在 option中設置matchBase:true,當模式中沒有/,它會在任意目錄下去匹配。例如*.js會匹配到test/simple/basic.js。
空集
如果沒有匹配到任何文件,它會返回空數組[]。它與shell不一樣,shell會在未匹配的情況下返回本身。例如:
$ echo a*s*d*f a*s*d*f可以通過設置optionnonull:true,來獲得和bash shell一樣的效果。
glob.hasMagic(pattern, [options])
如果pattern中有任何特殊字符串,則返回為true,否則返回為false。
注意:options會影響結果。
如果options中設置noext:true,那么+(a|b)將不會視為魔術模式。
如果模式中支持{}表達式,那么也屬于Magic,例如a/{b/c,x/y}。除非option設置nobrace:true。
glob(pattern, [options], cb)
- pattern {String}: 匹配模式。
- options {Object}
- cb {Function}
- err {Error | null}
- matches {Array<String>}: 匹配模式后的文件名數組。
執行異步全局搜索。
glob.sync(pattern, [options])
- pattern {String}:匹配模式。
- options {Object}
- return: {Array<String>}:匹配模式下的文件名。
執行異步全局搜索。
Class: glob.Glob
通過實例化glob.Glob來創建Glob對象。
var Glob = require("glob").Glob var mg = new Glob(pattern, options, cb)它是一個EventEmitter。它會立即執行遍歷目錄進行匹配。
new glob.Glob(pattern, [options], [cb])
- pattern {String}: 匹配模式。
- options {Object}
- cb {Function}:成功或失敗的回掉。
- err {Error | null}
- matches {Array<String>}: 匹配后的文件名數組。
注意 如果option設置sync標志, 那么匹配結果可以通過g.found獲取。
屬性
- minimatch :glob使用的minimatch對象。
- options :傳入的option對象。
- aborted :布爾值,在調用abort()時會設置為true。 在abort()后無法再進行全局搜索,但是可以通過重新設置statCache去避免重復系統調用。
- cache :Object,可能有以下值:
- false - 路徑不存在。
- true - 路徑存在。
- 'FILE' - 路徑存在,但不是目錄。
- 'DIR' - 路徑存在,是目錄。
- [file, entries, ...] - 路徑存在,結果是數組,類似于fs.readdir的結果。
- statCache:fs.stat結果緩存,避免多次計算相同路徑。
- symlinks :記錄哪些路徑是符號鏈接,與**模式相關。
- realpathCache :傳遞給fs.realpath的可選參數,避免不必要的系統調用。存儲在Glob的實例對象上,可重復使用。
事件
- end:匹配完成后,收到匹配的結果。當nonull設置時,在沒有匹配結果的情況下會在返回的數組中包含原匹配模式字符串,默認情況下匹配結果是被排序的, 除非設置nosort。
- match: 每次發現匹配結果就會觸發,結果中包含匹配的信息。它不會刪除重復數據和解析的真實路徑。
- error:在發生意外錯誤時觸發。 如果設置options.strict,那么任何fs的錯誤都會觸發。
- abort:abort()調用時觸發。
方法
- pause:暫時停止搜索。
- resume:恢復搜索。
- abort:終止搜索。
選項
所有Minimatch的選項都可以傳遞給Glob去改變匹配模式,此外還添加了一些特有的glob-specific。
除非另有說明,否則所有選項默認都為false。
所有選項也會被添加到Glob對象上。
如果正在運行多個glob操作,可以通過Glob對象的傳遞options給后面的操作使用,方便某些stat和readdir調用。可以通過共享symlinks statCache realpathCache cache option加快并行glob操作。
- cwd:要搜索的當前目錄。默認process.cwd()。
- root:以/開始的掛載位置。默認是path.resolve(options.cwd, "/")(Unix系統是/,其他的一些Windows系統是C:\)。
- dot:在正常模式和**模式下包含.。注意,在模式字符串中定義的點將始終與.文件匹配。
- nomount:默認匹配模式中以/開始的會轉到根目錄的掛載點,以便返回有效的文件路徑。設置debug標志關閉此行為。
- mark:在目錄匹配中添加/。注意,這需要額外的stat調用。
- nosort:結果不排序。
- stat:設置true統計stat所有結果。它可能會降低性能,并且完全沒必要, 除非readdir認為文件存在的不可靠標志。
- silent:讀取目錄遇到異常錯誤,并向stderr打印報警信息。設置optionsilent,關閉警告信息。
- strict:嘗試讀取目錄遇到異常錯誤時,進行會繼續搜索其他匹配項。設置strict后,當出現這些情況時會引發錯誤。
- cache 可以看上同的cache屬性。傳入之前生成的緩存對象保存一些fs調用。
- statCache:文件系統信息結果的緩存,防止不必要的stat調用。 通常不需要設置它,如果你知道文件系統不會在調用中改變,你可以將statCache從一個glob()中調用傳遞給另一個的options對象中。
- symlinks 已知符號鏈接的緩存。在解析**匹配時,你可以傳入上一次生成的符號鏈接對象用來保存stat調用。
- sync 棄用:使用glob.sync(pattern, opts)替代。
- nounique:在一些情況中,{}模式會導致同一個文件在結果中出現多次。默認情況下,它會防止結果中出現重復值。設置這個屬性會關閉這個行為。
- nonull:設置不返回空數組,而是返回一個包含模式本身的數組。這是glob(3)中的默認值。
- debug:開啟后會在minimatch和glob開啟日志記錄。
- nobrace:不展開大括號,如{a,b}和{1..3}。
- noglobstar:針對多個文件名不匹配**(即 會替換為正常的*)。
- noext:不去匹配+(a|b)“extglob”模式。
- nocase:不區分大小寫的匹配。注意:在一些不區分大小寫的系統中no-magic模式默認會被匹配,stat和readir將不會引發錯誤。
- matchBase:如果模式中不包含/字符串,則執行僅基于basename匹配。也就是說*.js會被視為**/*.js,會匹配所有目錄下的所有js。
- nodir:只匹配文件,不匹配目錄。 (注意:只匹配目錄,只需要在模式的最后加上/)
- ignore:添加模式或glob模式的數組去排除匹配。注意,ignore模式下總是dot:true,其他設置無效。
- follow:**模式下,訪問符號鏈接目錄。注意 它可能會導致在出現循環鏈接時出現大量重復引用。
- realpath:設置為true會在所有結果中調用fs.realpath。在無法解析的符號鏈接下,返回匹配結果的完整絕對路徑。(雖然它通常是一個失效的符號鏈接)
- absolute:設置為真,將會在匹配的結果中接收到絕對路徑。與realpath不同,它也會影響match事件中的返回值。
博客名稱:王樂平博客
CSDN博客地址:http://blog.csdn.net/lecepin
本作品采用知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議進行許可。總結
以上是生活随笔為你收集整理的Glob Patterns匹配模式使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Large sum
- 下一篇: 表格列mouse经过时高亮显示