التابع File.fnmatch
في روبي
يتحقق التابع fnmatch
من تطابق مسار مع نمط محدَّد. هذا النمط ليس تعبيرًا نظاميًّا بل يتبع قواعد مشابهة لتعميم أسماء الملفات في الصدفة.
البنية العامة
fnmatch( pattern, path, [flags] ) → (true or false)
fnmatch?( pattern, path, [flags] ) → (true or false)
المعاملات
pattern
النمط المراد منه مطابقة المسار path
المعطى. يمكن أن يحتوي على المحارف الخاصَّة (metacharacters، أو تدعى محارف الصدفة أيضًا) التالية:
المحرف الخاص | الوصف |
---|---|
*
|
يطابق أي ملف. يمكن أن يُقيَّد بقيم أخرى في النطاق العام (glob). هذا المحرف يقابل / * /x. في التعابير النظامية. إليك بعض الأمثلة على تقييد هذا المحرف:
لمطابقة الملفات المخفية (التي تبدأ بنقط |
**
|
يطابق المجلدات بشكل تعاودي (recursively) أو الملفات بشكل توسعي (expansively). |
?
|
يطابق محرفًا واحدًا فقط. هذا المحرف يقابل /.{1}/ في التعابير النظامية.
|
[]
|
يطابق أي محرف موجود داخل القوسين المعقوفين. هذان القوسان يسلكان نفس سلوك القوسين المقابلين لهما في التعابير النظامية. |
\
|
يعد هذا المحرف محرف تهريب للمحرف الخاص الذي يأتي بعده. |
{a,b}
|
يطابق النمط الحرف a أو الحرف b إذا كان المعامل flag مضبوطًا إلى الراية File::FNM_EXTGLOB . هذا النمط يسلك نفس سلوك التعابير النظامية ((?:a|b) ).
|
path
مسار الملف المراد مطابقته.
flags
الرايات المستعملة لضبط عملية المطابقة. يمكن جمع عدة رايات عبر تطبيق العملية OR الثنائية على الثوابت FNM_XXX
. يستعمل نفس النمط العمومي والرايات عبر التابع Dir.glob
.
القيمة المعادة
تعاد القيمة true
إن تطابق المسار path
مع النمط pattern
. خلا ذلك، تعاد القيمة false
.
أمثلة
مثال على استعمال التابع fnmatch
:
File.fnmatch('cat', 'cat') #=> true # match entire string
File.fnmatch('cat', 'category') #=> false # only match partial string
File.fnmatch('c{at,ub}s', 'cats') #=> false # { } isn't supported by default
File.fnmatch('c{at,ub}s', 'cats', File::FNM_EXTGLOB) #=> true # { } is supported on FNM_EXTGLOB
File.fnmatch('c?t', 'cat') #=> true # '?' match only 1 character
File.fnmatch('c??t', 'cat') #=> false # ditto
File.fnmatch('c*', 'cats') #=> true # '*' match 0 or more characters
File.fnmatch('c*t', 'c/a/b/t') #=> true # ditto
File.fnmatch('ca[a-z]', 'cat') #=> true # inclusive bracket expression
File.fnmatch('ca[^t]', 'cat') #=> false # exclusive bracket expression ('^' or '!')
File.fnmatch('cat', 'CAT') #=> false # case sensitive
File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=> true # case insensitive
File.fnmatch('?', '/', File::FNM_PATHNAME) #=> false # wildcard doesn't match '/' on FNM_PATHNAME
File.fnmatch('*', '/', File::FNM_PATHNAME) #=> false # ditto
File.fnmatch('[/]', '/', File::FNM_PATHNAME) #=> false # ditto
File.fnmatch('\?', '?') #=> true # escaped wildcard becomes ordinary
File.fnmatch('\a', 'a') #=> true # escaped ordinary remains ordinary
File.fnmatch('\a', '\a', File::FNM_NOESCAPE) #=> true # FNM_NOESCAPE makes '\' ordinary
File.fnmatch('[\?]', '?') #=> true # can escape inside bracket expression
File.fnmatch('*', '.profile') #=> false # wildcard doesn't match leading
File.fnmatch('*', '.profile', File::FNM_DOTMATCH) #=> true # period by default.
File.fnmatch('.*', '.profile') #=> true
rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string.
File.fnmatch(rbfiles, 'main.rb') #=> false
File.fnmatch(rbfiles, './main.rb') #=> false
File.fnmatch(rbfiles, 'lib/song.rb') #=> true
File.fnmatch('**.rb', 'main.rb') #=> true
File.fnmatch('**.rb', './main.rb') #=> false
File.fnmatch('**.rb', 'lib/song.rb') #=> true
File.fnmatch('*', 'dave/.profile') #=> true
pattern = '*' '/' '*'
File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME) #=> false
File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true
pattern = '**' '/' 'foo'
File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME) #=> true
File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME) #=> true
File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME) #=> true
File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME) #=> false
File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true
انظر أيضا
- التابع
blockdev?
: يتحقق إن كان ملفٌ ما هو جهاز كتلي (block device). - التابع
chardev?
: يتحقق إن كان ملفٌ ما هو جهاز محرفي (character device). - التابع
exist?
: يتحقق إن كان ملفٌ ما موجودًا.
- التابع
fnmatch?
: يتحقق من تطابق مسار مع نمط محدَّد.