أداة مطابقة الحد الأدنى.
هذه هي المكتبة المطابقة المستخدمة داخليًا بواسطة npm.
وهو يعمل عن طريق تحويل التعبيرات الشاملة إلى كائنات JavaScript RegExp
.
// وحدة مختلطة، يتم تحميلها باستخدام require() أو importimport { minimatch } من 'minimatch'// or:const { minimatch } = require('minimatch')minimatch('bar.foo', '*.foo') // صحيح!minimatch('bar.foo', '*.bar') // false!minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // صحيح، و صاخبة!
يدعم هذه الميزات العالمية:
توسيع هدفين
مطابقة الكرة الأرضية الموسعة
مطابقة "Globstar" **
فئات أحرف Posix، مثل [[:alpha:]]
، تدعم النطاق الكامل لأحرف Unicode. على سبيل المثال، [[:alpha:]]
سوف يتطابق مع 'é'
، على الرغم من أن [a-zA-Z]
لن يتطابق. لا يتم دعم تجميع الرموز ومطابقة المجموعة، لذلك لن يتطابق [[=e=]]
مع 'é'
ولن يتطابق [[.ch.]]
مع 'ch'
في اللغات المحلية حيث يعتبر ch
حرفًا واحدًا.
يرى:
man sh
مطابقة أنماط man bash
man 3 fnmatch
man 5 gitignore
الرجاء استخدام الخطوط المائلة للأمام فقط في التعبيرات الشاملة.
على الرغم من أن النوافذ تستخدم إما /
أو كفاصل للمسار الخاص بها، إلا أنه يتم استخدام الأحرف /
فقط بواسطة تطبيق الكرة الأرضية هذا. يجب عليك استخدام الخطوط المائلة للأمام فقط في التعبيرات الشاملة. سيتم دائمًا تفسير الخطوط المائلة الخلفية في الأنماط على أنها أحرف هروب، وليس فواصل المسار.
لاحظ أنه سيتم تفسير أو /
كفواصل للمسارات في المسارات على نظام التشغيل Windows، وسوف يتطابق مع /
في التعبيرات الشاملة.
لذا استخدم دائمًا /
في الأنماط.
في نظام التشغيل Windows، يتم التعامل مع مسارات UNC مثل //?/c:/...
أو //ComputerName/Share/...
بشكل خاص.
الأنماط التي تبدأ بشرطة مائلة مزدوجة متبوعة ببعض الأحرف التي لا تحتوي على شرطة مائلة ستحتفظ بالشرطة المائلة المزدوجة. ونتيجة لذلك، فإن نمطًا مثل //*
سوف يتطابق مع //x
، ولكن لن يتطابق مع /x
.
الأنماط التي تبدأ بـ //?/<drive letter>:
لن تعالج ?
كحرف البدل. بدلاً من ذلك، سيتم التعامل معها كسلسلة عادية.
الأنماط التي تبدأ بـ //?/<drive letter>:/...
سوف تتطابق مع مسارات الملفات التي تبدأ بـ <drive letter>:/...
والعكس صحيح، كما لو كان //?/
غير موجود. يوجد هذا السلوك فقط عندما تكون أحرف محركات الأقراص متطابقة مع بعضها البعض بشكل غير حساس لحالة الأحرف. تتم مقارنة الأجزاء المتبقية من المسار/النمط بحساسية لحالة الأحرف، ما لم يتم تعيين nocase:true
.
لاحظ أن تحديد مسار UNC باستخدام الأحرف كفواصل المسار مسموح به دائمًا في وسيطة مسار الملف، ولكنه مسموح به فقط في وسيطة النمط عندما يتم تعيين windowsPathsNoEscape: true
في الخيارات.
قم بإنشاء كائن minimatch عن طريق إنشاء فئة minimatch.Minimatch
.
var Minimatch = require('minimatch').Minimatchvar mm = Minimatch(pattern, options) جديد
pattern
هو النمط الأصلي الذي يمثله كائن minimatch.
options
الخيارات المقدمة للمنشئ.
set
مجموعة ثنائية الأبعاد من تعبيرات regexp أو سلسلة. يتوافق كل صف في المصفوفة مع نمط موسع. يتوافق كل عنصر في الصف مع جزء مسار واحد. على سبيل المثال، النمط {a,b/c}/d
سوف يمتد إلى مجموعة من الأنماط مثل:
[ [ a, d ] , [ b, c, d ] ]
إذا كان جزء من النمط لا يحتوي على أي "سحر" فيه (أي أنه يشبه "foo"
بدلاً من fo*o?
) ، فسيتم تركه كسلسلة بدلاً من تحويله إلى تعبير عادي.
regexp
تم إنشاؤه بواسطة طريقة makeRe
. تعبير عادي واحد يعبر عن النمط بأكمله. يعد هذا مفيدًا في الحالات التي ترغب فيها في استخدام النمط إلى حدٍ ما مثل fnmatch(3)
مع تمكين FNM_PATH
.
negate
صحيح إذا تم إبطال النمط.
comment
صحيح إذا كان النمط تعليقًا.
empty
صحيح إذا كان النمط هو ""
.
makeRe()
قم بإنشاء عضو regexp
إذا لزم الأمر، وقم بإعادته. سيتم إرجاع false
إذا كان النمط غير صالح.
match(fname)
يُرجع صحيحًا إذا كان اسم الملف يطابق النمط، أو يُرجع خطأ بخلاف ذلك.
matchOne(fileArray, patternArray, partial)
خذ اسم الملف /
-split، وقم بمطابقته مع صف واحد في regExpSet
. هذه الطريقة مخصصة للاستخدام الداخلي بشكل أساسي، ولكنها مكشوفة بحيث يمكن استخدامها بواسطة جهاز glob-walker الذي يحتاج إلى تجنب استدعاءات نظام الملفات المفرطة.
hasMagic()
يُرجع صحيحًا إذا كان النمط المُحلل يحتوي على أي أحرف سحرية. إرجاع خطأ إذا كانت جميع أجزاء المقارنة عبارة عن سلسلة حرفية. إذا تم تعيين خيار magicalBraces
على المنشئ، فسوف يعتبر توسيعات الأقواس التي ليست سحرية بأي حال من الأحوال سحرية. إذا لم يتم تعيينه، فسيُرجع نمط مثل a{b,c}d
false
، لأنه لا يحتوي abd
أو acd
على أي أحرف عالمية خاصة.
هذا لا يعني أنه يمكن استخدام سلسلة النمط كاسم ملف حرفي، لأنها قد تحتوي على أحرف الكرة السحرية التي تم الهروب منها. على سبيل المثال، النمط *
أو [*]
لن يتم اعتباره سحريًا، حيث أن الجزء المطابق يترجم إلى السلسلة الحرفية '*'
وسيطابق المسار المسمى '*'
، وليس '*'
أو '[*]'
. يمكن استخدام التابع minimatch.unescape()
لإزالة أحرف الهروب.
كافة الطرق الأخرى داخلية، وسيتم استدعاؤها عند الضرورة.
التصدير الرئيسي. يختبر المسار مقابل النمط باستخدام الخيارات.
فار isJS = minimatch(file, '*.js', { matchBase: true })
تُرجع دالة تختبر الوسيطة المتوفرة لها، وهي مناسبة للاستخدام مع Array.filter
. مثال:
فار جافا سكريبت = fileList.filter(minimatch.filter('*.js', { matchBase: صحيح }))
قم بالهروب من جميع الشخصيات السحرية في نمط الكرة الأرضية، بحيث يتطابق فقط مع السلاسل الحرفية
إذا تم استخدام خيار windowsPathsNoEscape
، فسيتم تخطي الأحرف عن طريق الالتفاف في []
، لأن الحرف السحري المغلف في فئة الأحرف لا يمكن إرضاؤه إلا بهذا الحرف بالضبط.
لا يمكن الهروب من الخطوط المائلة (والخطوط المائلة العكسية في وضع windowsPathsNoEscape
) أو عدم إلغائها.
قم بإلغاء الهروب من سلسلة شاملة قد تحتوي على بعض الأحرف التي تم تجاوزها.
إذا تم استخدام خيار windowsPathsNoEscape
، فستتم إزالة هروب الأقواس المربعة، ولكن لا تتم إزالة هروب الشرطة المائلة العكسية. على سبيل المثال، سيحول السلسلة '[*]'
إلى *
، لكنه لن يحول '*'
إلى '*'
، لأنه فاصل مسار في وضع windowsPathsNoEscape
.
عندما لا يتم تعيين windowsPathsNoEscape
، تتم إزالة كل من هروب الأقواس وهروب الشرطة المائلة العكسية.
لا يمكن الهروب من الخطوط المائلة (والخطوط المائلة العكسية في وضع windowsPathsNoEscape
) أو عدم إلغائها.
قم بالمطابقة مع قائمة الملفات بأسلوب fnmatch أو glob. إذا لم يتطابق أي شيء، وتم تعيين options.nonull، فقم بإرجاع قائمة تحتوي على النمط نفسه.
فار javascripts = minimatch.match(fileList, '*.js', { matchBase: true })
أنشئ كائن تعبير عادي من النمط.
جميع الخيارات false
بشكل افتراضي.
تفريغ طن من الأشياء إلى stderr.
لا تقم بتوسيع مجموعات الأقواس {a,b}
و {1..3}
.
تعطيل **
المطابقة مع أسماء المجلدات المتعددة.
السماح للأنماط بمطابقة أسماء الملفات التي تبدأ بنقطة، حتى إذا لم يكن النمط يحتوي بشكل واضح على نقطة في تلك البقعة.
لاحظ أنه افتراضيًا، لن يتطابق a/**/b
a/.d/b
، ما لم يتم تعيين dot
.
قم بتعطيل أنماط الأنماط "extglob" مثل +(a|b)
.
قم بإجراء مطابقة غير حساسة لحالة الأحرف.
عند استخدامها مع {nocase: true}
، قم بإنشاء تعبيرات عادية غير حساسة لحالة الأحرف، ولكن اترك أجزاء مطابقة السلسلة دون تغيير. ليس له أي تأثير عند استخدامه بدون {nocase: true}
يكون مفيدًا عند استخدام شكل آخر من أشكال المطابقة غير الحساسة لحالة الأحرف، أو إذا كان تمثيل السلسلة الأصلية مفيدًا بطريقة أخرى.
عندما لا يتم العثور على تطابق بواسطة minimatch.match
، قم بإرجاع قائمة تحتوي على النمط نفسه إذا تم تعيين هذا الخيار. عندما لا يتم تعيينها، يتم إرجاع قائمة فارغة إذا لم تكن هناك تطابقات.
يؤثر هذا فقط على نتائج أسلوب Minimatch.hasMagic
.
إذا كان النمط يحتوي على امتدادات قوسية، مثل a{b,c}d
، ولكن لا يحتوي على أحرف سحرية أخرى، فسيُرجع الأسلوب Minimatch.hasMagic()
false
افتراضيًا. عند تعيين هذا الخيار، فإنه سيعود true
لتوسيع القوس بالإضافة إلى أحرف الكرة السحرية الأخرى.
إذا تم تعيينها، فستتم مطابقة الأنماط التي لا تحتوي على خطوط مائلة مع الاسم الأساسي للمسار إذا كان يحتوي على خطوط مائلة. على سبيل المثال، a?b
سيطابق المسار /xyz/123/acb
، لكن ليس /xyz/acb/123
.
قمع سلوك التعامل مع #
في بداية النمط كتعليق.
قمع سلوك معاملة الرائدة !
الطابع كما النفي.
يعود من تعبيرات النفي كما لو لم يتم نفيها. (أي: صحيح عند الضربة، وكاذب عند الخطأ.)
قارن المسار الجزئي بالنمط. طالما أن أجزاء المسار الموجودة لا تتعارض مع النمط، فسيتم التعامل معها على أنها مطابقة. يعد هذا مفيدًا في التطبيقات التي تنتقل فيها عبر بنية المجلد، ولا يتوفر لديك المسار الكامل بعد، ولكنك تريد التأكد من أنك لا تسير في مسارات لا يمكن أن تكون متطابقة أبدًا.
على سبيل المثال،
minimatch('/a/b', '/a/*/c/d', { جزئي: صحيح }) // صحيح، قد يكون /a/b/c/dminimatch('/a/b', '/ **/d', { جزئي: صحيح }) // صحيح، قد يكون /a/b/.../dminimatch('/x/y/z', '/a/**/z', { جزئي : صحيح }) // خطأ، لأن x !== a
استخدم كفاصل للمسار فقط ، وليس كحرف هروب أبدًا . في حالة التعيين، يتم استبدال جميع الأحرف
بـ
/
في النمط. لاحظ أن هذا يجعل من المستحيل المطابقة مع المسارات التي تحتوي على أحرف نمط الكرة الأرضية، ولكنه يسمح بالمطابقة مع الأنماط التي تم إنشاؤها باستخدام path.join()
و path.resolve()
على منصات Windows، ومحاكاة سلوك (العربات التي تجرها الدواب!) للإصدارات السابقة على Windows . الرجاء استخدام بحذر، وأن تضع في اعتبارها التحذير بشأن مسارات Windows.
لأسباب قديمة، يتم تعيين هذا أيضًا إذا تم تعيين options.allowWindowsEscape
على القيمة الدقيقة false
.
عندما يبدأ النمط بمسار UNC أو حرف محرك الأقراص، وفي الوضع nocase:true
، لا تقم بتحويل الأجزاء الجذرية للنمط إلى تعبير عادي غير حساس لحالة الأحرف، وبدلاً من ذلك اتركها كسلاسل.
هذا هو الإعداد الافتراضي عندما يكون النظام الأساسي هو win32
ويتم تعيين nocase:true
.
افتراضيًا، يتم التعامل مع الأحرف /
المتعددة (بخلاف //
البادئة في مسار UNC، راجع "مسارات UNC" أعلاه) على أنها /
مفردة.
أي أن نمطًا مثل a///b
سيطابق مسار الملف a/b
.
قم بتعيين preserveMultipleSlashes: true
لمنع هذا السلوك.
رقم يشير إلى مستوى التحسين الذي يجب إجراؤه على النموذج قبل تحليله واستخدامه للمطابقات.
يتم دائمًا تحويل أجزاء Globstar **
إلى *
عند تعيين noglobstar
، ويتم تحويل أجزاء **
المتجاورة المتعددة إلى **
واحد (على سبيل المثال، سيتم التعامل مع a/**/**/b
على أنه a/**/b
, لأن هذا متساوٍ في جميع الأحوال).
0
- عدم إجراء أي تغييرات أخرى. في هذا الوضع .
و ..
يتم الاحتفاظ بها في النموذج، مما يعني أنها يجب أن تظهر أيضًا في نفس الموضع في سلسلة مسار الاختبار. على سبيل المثال، نمط مثل a/*/../c
سوف يتطابق مع السلسلة a/b/../c
ولكن ليس السلسلة a/c
.
1
- (افتراضي) قم بإزالة الحالات التي تكون فيها النقطة المزدوجة ..
تتبع جزءًا من النمط ليس **
, .
أو ..
أو فارغة ''
. على سبيل المثال، يتم تحويل النمط ./a/b/../*
إلى ./a/*
، وبالتالي سيطابق سلسلة المسار ./a/c
، ولكن ليس سلسلة المسار ./a/b/../c
. يتم الاحتفاظ بالنقاط وأجزاء المسار الفارغة في النموذج.
2
(أو أعلى) - تحسينات أكثر قوة ومناسبة للاستخدام مع حالات نقل الملفات:
في حين أن هذه التحسينات تعمل على تحسين أداء حالات استخدام نقل الملفات مثل الكرة الشاملة (أي سبب وجود هذه الوحدة)، إلا أن هناك حالات ستفشل فيها في مطابقة سلسلة حرفية كانت ستتم مطابقتها في مستوى التحسين 1 أو 0.
على وجه التحديد، في حين أن التابع Minimatch.match()
سيعمل على تحسين سلسلة مسار الملف بنفس الطرق، مما يؤدي إلى نفس التطابقات، إلا أنه سيفشل عند اختباره باستخدام التعبير العادي المقدم من Minimatch.makeRe()
، ما لم تكن سلسلة المسار هي الأولى تتم معالجتها باستخدام minimatch.levelTwoFileOptimize()
أو ما شابه.
قم بإزالة الحالات التي تتبع فيها النقطة المزدوجة ..
جزءًا من النمط ليس **
, .
أو فارغة ''
. إزالة فارغة و .
أجزاء من النموذج، حيث يكون من الآمن القيام بذلك (على سبيل المثال، في أي مكان آخر غير الموضع الأخير، أو الموضع الأول، أو الموضع الثاني في نمط يبدأ بـ /
، حيث قد يشير هذا إلى مسار UNC على Windows).
تحويل الأنماط التي تحتوي على <pre>/**/../<p>/<rest>
إلى ما يعادلها <pre>/{..,**}/<p>/<rest>
، حيث <p>
هو نمط جزء غير .
, ..
, **
, أو فارغة ''
.
إزالة التكرار من الأنماط حيث يوجد جزء **
في أحدهما ويتم حذفه في آخر، وهو ليس جزء المسار النهائي، وهما متكافئان بخلاف ذلك. لذلك يصبح {a/**/b,a/b}
a/**/b
، لأن **
يتطابق مع جزء المسار الفارغ.
قم بإزالة التكرار من الأنماط حيث يوجد جزء *
في جزء واحد، ونمط غير نقطي بخلاف **
, .
، ..
، أو ''
في نفس الوضع في الآخر. لذا يصبح a/{*,x}/b
a/*/b
، لأن *
يمكن أن يتطابق مع x
.
عند التعيين على win32
، سيؤدي هذا إلى تشغيل جميع السلوكيات الخاصة بالنوافذ (معالجة خاصة لمسارات UNC، والمعاملة كفواصل في مسارات الملفات للمقارنة.)
الإعدادات الافتراضية هي قيمة process.platform
.
على الرغم من أن الالتزام الصارم بالمعايير الحالية يعد هدفًا جديرًا بالاهتمام، إلا أن هناك بعض التناقضات بين التطبيقات البسيطة والتطبيقات الأخرى. بعضها مقصود، وبعضها لا مفر منه.
إذا كان النمط يبدأ بـ !
الشخصية، فإنه ينفي. قم بتعيين علامة nonegate
لمنع هذا السلوك، وتعامل مع البادئة !
الشخصيات بشكل طبيعي. ربما يكون هذا مناسبًا إذا كنت ترغب في بدء النمط بنمط extglob سلبي مثل !(a|B)
. عديد !
الأحرف الموجودة في بداية النمط ستبطل النمط عدة مرات.
إذا بدأ النمط بـ #
، فسيتم التعامل معه كتعليق، ولن يطابق أي شيء. استخدم #
لمطابقة #
حرفيًا في بداية السطر، أو قم بتعيين علامة nocomment
لمنع هذا السلوك.
يتم دعم حرف النجمة المزدوجة **
بشكل افتراضي، ما لم يتم تعيين علامة noglobstar
. يتم دعم هذا بطريقة bsdglob وbash 4.1، حيث يكون لـ **
أهمية خاصة فقط إذا كان هو الشيء الوحيد في جزء المسار. وهذا يعني أن a/**/b
سوف يطابق a/x/y/b
، لكن a/**b
لن يتطابق.
إذا لم يكن للنمط المُفلت أي تطابقات، وتم تعيين علامة nonull
، فإن minimatch.match يُرجع النمط كما هو مُقدم، بدلاً من تفسير هروب الأحرف. على سبيل المثال، minimatch.match([], "*a?")
سوف يُرجع "*a?"
بدلاً من "*a?"
. يشبه هذا تعيين خيار nullglob
في bash، باستثناء أنه لا يحل أحرف النمط التي تم تجاوزها.
إذا لم يتم تعطيل توسيع الدعامة، فسيتم تنفيذه قبل أي تفسير آخر لنمط الكرة الأرضية. وبالتالي، فإن نمطًا مثل +(a|{b),c)}
، والذي لن يكون صالحًا في bash أو zsh، يتم توسيعه أولاً إلى مجموعة +(a|b)
و +(a|c)
، وتلك يتم التحقق من صحة الأنماط. وبما أن هذين صحيحين، فإن عائدات المطابقة.
يتم التعامل مع أنماط extglob السلبية بأكبر قدر ممكن من دلالات Bash، ولكن هناك بعض الحالات ذات extglob السلبية التي يصعب للغاية التعبير عنها في تعبير JavaScript العادي. على وجه الخصوص، فإن النمط السلبي <start>!(<pattern>*|)*
سوف يطابق في bash أي شيء لا يبدأ بـ <start><pattern>
. ومع ذلك، <start>!(<pattern>*)*
سوف يطابق المسارات التي تبدأ بـ <start><pattern>
، لأن السلسلة الفارغة يمكن أن تتطابق مع الجزء السلبي. في هذه المكتبة، لن يتطابق <start>!(<pattern>*|)*
أي نمط يبدأ بـ <start>
، بسبب الاختلاف في الأنماط التي تعتبر "جشعة" في التعبيرات العادية مقابل توسيع مسار bash. وقد يكون هذا الأمر قابلاً للإصلاح، ولكن ليس من دون تكبد بعض تكاليف التعقيد والأداء، ويبدو أن المقايضة لا تستحق المتابعة.
لاحظ أن fnmatch(3)
في libc هو مُطابق مقارنة سلاسل ساذج للغاية، ولا يفعل أي شيء خاص للشرطة المائلة. تم تصميم هذه المكتبة لاستخدامها في البحث الشامل ومشايات الملفات، ولذا فهي تقوم بأشياء خاصة باستخدام /
. ومن ثم، لن يتطابق foo*
مع foo/bar
في هذه المكتبة، على الرغم من أنه سيكون في fnmatch(3)
.