我需要撰寫一個檔案 glob 來匹配除某個檔案夾中包含的檔案之外的所有檔案(例如,除高級檔案夾中包含的檔案之外的所有檔案foo/。
我已經到達了以下全域:
!(foo)/**/*
然而,這水珠似乎并不匹配在Ruby中的任何檔案File.fnmatch(即使FNM_PATHNAME和FNM_DOTMATCH設定為true。
此外,Ruby 的 glob 解釋器似乎與 JavaScript 的行為不同:
JavaScript glob 解釋器匹配所有字串
Ruby glob 解釋器不匹配任何字串:
2.6.2 :027 > File.fnmatch("!(foo)/**/*", "hello/world.js")
=> false
2.6.2 :028 > File.fnmatch("!(foo)/**/*", "test/some/globs")
=> false
2.6.2 :029 > File.fnmatch("!(foo)/**/*", "foo/bar/something.txt")
=> false
uj5u.com熱心網友回復:
如果您確實需要使用 glob,那么您可以列出允許的內容,使其等效于否定:
extglob = "{[^f]*,f,f[^o]*,fo,fo[^o]*,foo?*}/**/*"
File.fnmatch(extglob, "hello/world.js", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> true
File.fnmatch(extglob, "test/some/globs", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> true
File.fnmatch(extglob, "foo/bar/something.txt", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> false
File.fnmatch(extglob, "food/bar/something.txt", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> true
{[^f]*,f,f[^o]*,fo,fo[^o]*,foo?*} 方法:
- 任何不以開頭的字串
f - 壓力
f - 任何以 開頭
f且第二個字符不是a 的字串o - 字串
fo - 以 開頭
fo且第三個字符不是a 的任何字串o - 任何以 開頭的字串,
foo如果它至少還有一個字符
更新
如果您的字串文字太長,生成一個否定它的 glob 可能會很痛苦,那么為什么不為它創建一個函式呢?
def extglob_neg str
str.each_char.with_index.with_object([]) do |(_,i),arr|
arr << "#{str[0,i]}[^#{str[i]}]*"
arr << str[0..i]
end.join(',').prepend('{').concat('?*}')
end
extglob_neg "Food"
#=> "{[^F]*,F,F[^o]*,Fo,Fo[^o]*,Foo,Foo[^d]*,Food?*}"
注意:我沒有在這個函式中實作任何 glob 轉義,因為它看起來有點復雜。雖然我可能是錯的
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360005.html
