Glob Patterns匹配模式使用

快樂平方發表於2018-12-29

前段時間在用workbox時,在做precache時,匹配模式基於的是Glob Pattern模式,於是就看了下相關文件。

下面翻譯一下node-glob的使用,原文:github.com/isaacs/node…


Glob

像在shell裡面,用*等匹配模式來匹配檔案。

Glob基於Javascript實現,使用minimatch庫進行匹配。

Glob Patterns匹配模式使用

使用

使用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/cabcd

在匹配路徑使用時,以下字元有一些特殊的作用:

  • *:匹配單路徑下的 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的結果。
  • statCachefs.stat結果快取,避免多次計算相同路徑。
  • symlinks :記錄哪些路徑是符號連結,與**模式相關。
  • realpathCache :傳遞給fs.realpath的可選引數,避免不必要的系統呼叫。儲存在Glob的例項物件上,可重複使用。

事件

  • end:匹配完成後,收到匹配的結果。當nonull設定時,在沒有匹配結果的情況下會在返回的陣列中包含原匹配模式字串,預設情況下匹配結果是被排序的, 除非設定nosort
  • match: 每次發現匹配結果就會觸發,結果中包含匹配的資訊。它不會刪除重複資料和解析的真實路徑。
  • error:在發生意外錯誤時觸發。 如果設定options.strict,那麼任何fs的錯誤都會觸發。
  • abortabort()呼叫時觸發。

方法

  • pause:暫時停止搜尋。
  • resume:恢復搜尋。
  • abort:終止搜尋。

選項

所有Minimatch的選項都可以傳遞給Glob去改變匹配模式,此外還新增了一些特有的glob-specific

除非另有說明,否則所有選項預設都為false

所有選項也會被新增到Glob物件上。

如果正在執行多個glob操作,可以通過Glob物件的傳遞options給後面的操作使用,方便某些statreaddir呼叫。可以通過共享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:開啟後會在minimatchglob開啟日誌記錄。
  • nobrace:不展開大括號,如{a,b}{1..3}
  • noglobstar:針對多個檔名不匹配**(即 會替換為正常的*)。
  • noext:不去匹配+(a|b)“extglob”模式。
  • nocase:不區分大小寫的匹配。注意:在一些不區分大小寫的系統中no-magic模式預設會被匹配,statreadir將不會引發錯誤。
  • matchBase:如果模式中不包含/字串,則執行僅基於basename匹配。也就是說*.js會被視為**/*.js,會匹配所有目錄下的所有js。
  • nodir:只匹配檔案,不匹配目錄。 (注意:只匹配目錄,只需要在模式的最後加上/)
  • ignore:新增模式或glob模式的陣列去排除匹配。注意,ignore模式下總是dot:true,其他設定無效。
  • follow**模式下,訪問符號連結目錄。注意 它可能會導致在出現迴圈連結時出現大量重複引用。
  • realpath:設定為true會在所有結果中呼叫fs.realpath。在無法解析的符號連結下,返回匹配結果的完整絕對路徑。(雖然它通常是一個失效的符號連結)
  • absolute:設定為真,將會在匹配的結果中接收到絕對路徑。與realpath不同,它也會影響match事件中的返回值。

部落格名稱:王樂平部落格

CSDN部落格地址:blog.csdn.net/lecepin

知識共享許可協議
本作品採用知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議進行許可。

相關文章