التابع File.fnmatch في روبي

من موسوعة حسوب
< Ruby‏ | File

يتحقق التابع fnmatch من تطابق مسار مع نمط محدَّد. هذا النمط ليس تعبيرًا نظاميًّا بل يتبع قواعد مشابهة لتعميم أسماء الملفات في الصدفة.

البنية العامة

fnmatch( pattern, path, [flags] )  (true or false)
fnmatch?( pattern, path, [flags] )  (true or false)

المعاملات

pattern

النمط المراد منه مطابقة المسار path المعطى. يمكن أن يحتوي على المحارف الخاصَّة (metacharacters، أو تدعى محارف الصدفة أيضًا) التالية:

المحرف الخاص الوصف
* يطابق أي ملف. يمكن أن يُقيَّد بقيم أخرى في النطاق العام (glob). هذا المحرف يقابل ‎/ * /x‎. في التعابير النظامية. إليك بعض الأمثلة على تقييد هذا المحرف:
  • *: يطابق جميع الملفات الطبيعية.
  • *c: يطابق كل الملفات التي تبدأ بالحرف c.
  • c*: يطابق كل الملفات التي تنتهي بالحرف c.
  • *c*: يطابق جميع الملفات التي تملك الحرف c في اسمها (سواءً أكان في البداية أم في النهاية).

لمطابقة الملفات المخفية (التي تبدأ بنقط .)، فحدِّد الراية File::FNM_DOTMATCH للمعامل flag.

** يطابق المجلدات بشكل تعاودي (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?‎: يتحقق من تطابق مسار مع نمط محدَّد.

مصادر