ยูทิลิตี้การจับคู่ขั้นต่ำ
นี่คือไลบรารี่ที่ตรงกันซึ่งใช้ภายในเวลา npm
มันทำงานโดยการแปลงนิพจน์ glob เป็นวัตถุ JavaScript RegExp
// โมดูลไฮบริด โหลดด้วย need() หรือ importimport { minimatch } จาก 'minimatch'// หรือ:const { minimatch } = need('minimatch')minimatch('bar.foo', '*.foo') // true!minimatch('bar.foo', '*.bar') // false!minimatch('bar.foo', '*.+(bar|foo)', { ดีบัก: true }) // จริงและมีเสียงดัง!
รองรับคุณสมบัติ glob เหล่านี้:
การขยายตัวของรั้ง
การจับคู่ glob แบบขยาย
"Globstar" **
ตรงกัน
คลาสอักขระ Posix เช่น [[:alpha:]]
รองรับอักขระ Unicode อย่างเต็มรูปแบบ ตัวอย่างเช่น [[:alpha:]]
จะจับคู่กับ 'é'
แม้ว่า [a-zA-Z]
จะไม่ตรงกันก็ตาม ไม่รองรับการจับคู่สัญลักษณ์และชุด ดังนั้น [[=e=]]
จะ ไม่ ตรงกับ 'é'
และ [[.ch.]]
จะไม่ตรงกับ 'ch'
ในภาษาที่ ch
ถือเป็นอักขระตัวเดียว
ดู:
man sh
การจับคู่รูปแบบ man bash
man 3 fnmatch
man 5 gitignore
โปรดใช้เครื่องหมายทับในนิพจน์ glob เท่านั้น
แม้ว่า windows จะใช้ /
หรือเป็นตัวคั่นพาธ แต่การใช้งาน glob นี้จะใช้เฉพาะ /
อักขระเท่านั้น คุณต้องใช้เครื่องหมายทับในนิพจน์ glob เท่านั้น แบ็กสแลชในรูปแบบจะถูกตีความว่าเป็นอักขระหลีกเสมอ ไม่ใช่ตัวคั่นพาธ
โปรดทราบว่าหรือ /
จะ ถูกตีความว่าเป็นตัวแยกเส้นทางในเส้นทางบน Windows และจะจับคู่กับ /
ในนิพจน์ glob
ดังนั้นให้ใช้ /
ในรูปแบบเสมอ
บน Windows เส้นทาง UNC เช่น //?/c:/...
หรือ //ComputerName/Share/...
จะได้รับการจัดการเป็นพิเศษ
รูปแบบที่เริ่มต้นด้วยเครื่องหมายทับคู่ตามด้วยอักขระที่ไม่ใช่เครื่องหมายทับบางตัวจะคงเครื่องหมายทับคู่ไว้ เป็นผลให้รูปแบบเช่น //*
จะจับคู่ //x
แต่ไม่ตรงกับ /x
รูปแบบที่จ้องมองด้วย //?/<drive letter>:
จะ ไม่ ถือว่า ?
เป็นอักขระตัวแทน แต่จะถือเป็นสตริงปกติแทน
รูปแบบที่ขึ้นต้นด้วย //?/<drive letter>:/...
จะจับคู่พาธของไฟล์ที่ขึ้นต้นด้วย <drive letter>:/...
และในทางกลับกัน เหมือนกับว่า //?/
ไม่มีอยู่ ลักษณะการทำงานนี้จะปรากฏเฉพาะเมื่ออักษรระบุไดรฟ์เป็นแบบตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เท่านั้น ส่วนที่เหลือของเส้นทาง/รูปแบบจะถูกเปรียบเทียบโดยพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เว้นแต่จะตั้งค่า nocase:true
โปรดทราบว่าการระบุเส้นทาง UNC โดยใช้อักขระเป็นตัวแยกเส้นทางจะได้รับอนุญาตเสมอในอาร์กิวเมนต์เส้นทางไฟล์ แต่จะอนุญาตเฉพาะในอาร์กิวเมนต์รูปแบบเมื่อ windowsPathsNoEscape: true
ถูกตั้งค่าในตัวเลือก
สร้างวัตถุ minimatch โดยการสร้างอินสแตนซ์ของคลาส minimatch.Minimatch
var Minimatch = need('minimatch').Minimatchvar mm = new Minimatch(รูปแบบ ตัวเลือก)
pattern
แบบดั้งเดิมที่วัตถุมินิแมตช์เป็นตัวแทน
options
ตัวเลือกที่ให้กับตัวสร้าง
set
ค่าอาร์เรย์ 2 มิติของนิพจน์ regexp หรือสตริง แต่ละแถวในอาร์เรย์สอดคล้องกับรูปแบบที่ขยายด้วยปีกกา แต่ละรายการในแถวสอดคล้องกับส่วนเส้นทางเดียว ตัวอย่างเช่น รูปแบบ {a,b/c}/d
จะขยายเป็นชุดรูปแบบเช่น:
[ [ a, d ] , [ b, c, d ] ]
หากส่วนหนึ่งของรูปแบบไม่มี "เวทย์มนตร์" ใดๆ อยู่ในนั้น (นั่นคือ มีลักษณะคล้าย "foo"
แทนที่จะเป็น fo*o?
) ก็จะถูกปล่อยให้เป็นสตริง แทนที่จะแปลงเป็นนิพจน์ทั่วไป
regexp
สร้างโดยเมธอด makeRe
นิพจน์ทั่วไปเดียวที่แสดงรูปแบบทั้งหมด สิ่งนี้มีประโยชน์ในกรณีที่คุณต้องการใช้รูปแบบเช่น fnmatch(3)
โดยเปิดใช้งาน FNM_PATH
negate
True หากรูปแบบถูกปฏิเสธ
comment
True ถ้ารูปแบบเป็นความคิดเห็น
empty
จริง หากรูปแบบเป็น ""
makeRe()
สร้างสมาชิก regexp
หากจำเป็น และส่งคืน จะส่งคืน false
หากรูปแบบไม่ถูกต้อง
match(fname)
ให้คืนค่าเป็นจริงหากชื่อไฟล์ตรงกับรูปแบบ หรือคืนค่าเป็นเท็จ
matchOne(fileArray, patternArray, partial)
ใช้ /
-split ชื่อไฟล์ และจับคู่กับแถวเดียวใน regExpSet
วิธีการนี้ใช้สำหรับการใช้งานภายในเป็นหลัก แต่มีการเปิดเผยเพื่อให้ glob-walker สามารถใช้งานได้ซึ่งจำเป็นต้องหลีกเลี่ยงการเรียกระบบไฟล์มากเกินไป
hasMagic()
คืนค่าเป็นจริงหากรูปแบบการแยกวิเคราะห์มีอักขระเวทย์มนตร์ ส่งคืนค่าเท็จหากส่วนของตัวเปรียบเทียบทั้งหมดเป็นตัวอักษรสตริง หากตั้งค่าตัวเลือก magicalBraces
ไว้บน Constructor มันจะพิจารณาการขยายวงเล็บปีกกาซึ่งไม่ถือเป็นเวทย์มนตร์อย่างอื่น หากไม่ได้ตั้งค่า รูปแบบเช่น a{b,c}d
จะส่งกลับ false
เนื่องจากทั้ง abd
และ acd
ไม่มีอักขระ glob พิเศษใดๆ
นี่ ไม่ ได้หมายความว่าสตริงรูปแบบสามารถใช้เป็นชื่อไฟล์ตามตัวอักษรได้ เนื่องจากอาจมีอักขระ Magic glob ที่ถูก Escape ตัวอย่างเช่น รูปแบบ *
หรือ [*]
จะไม่ถือว่ามีเวทย์มนตร์ เนื่องจากส่วนที่ตรงกันจะแยกวิเคราะห์สตริงตัวอักษร '*'
และจะจับคู่เส้นทางที่ชื่อ '*'
ไม่ใช่ '*'
หรือ '[*]'
. อาจใช้เมธอด minimatch.unescape()
เพื่อลบอักขระหลีกออก
วิธีการอื่นๆ ทั้งหมดเป็นแบบภายใน และจะถูกเรียกตามความจำเป็น
การส่งออกหลัก ทดสอบเส้นทางกับรูปแบบโดยใช้ตัวเลือก
var isJS = minimatch (ไฟล์, '*.js', { matchBase: true })
ส่งคืนฟังก์ชันที่ทดสอบอาร์กิวเมนต์ที่ให้มา ซึ่งเหมาะสำหรับการใช้กับ Array.filter
ตัวอย่าง:
var javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true }))
หลบหนีตัวละครเวทย์มนตร์ทั้งหมดในรูปแบบลูกกลม เพื่อที่มันจะจับคู่เฉพาะสตริงตามตัวอักษรเท่านั้น
หากใช้ตัวเลือก windowsPathsNoEscape
อักขระจะถูกหลีกโดยการใส่ []
เนื่องจากอักขระเวทย์มนตร์ที่รวมอยู่ในคลาสอักขระจะสามารถตอบสนองได้ด้วยอักขระนั้นเท่านั้น
เครื่องหมายทับ (และเครื่องหมายแบ็กสแลชในโหมด windowsPathsNoEscape
) ไม่สามารถหลีกหรือหลีกได้
ยกเลิกการยกเว้นสตริง glob ที่อาจมีอักขระบางตัวที่ใช้ Escape
หากใช้ตัวเลือก windowsPathsNoEscape
การหลีกเลี่ยงเครื่องหมายปีกกาแบบสี่เหลี่ยมจะถูกลบออก แต่จะไม่มีการยกเว้นเครื่องหมายแบ็กสแลช ตัวอย่างเช่น มันจะเปลี่ยนสตริง '[*]'
เป็น *
แต่จะไม่เปลี่ยน '*'
เป็น '*'
เนื่องจากเป็นตัวคั่นเส้นทางในโหมด windowsPathsNoEscape
เมื่อไม่ได้ตั้งค่า windowsPathsNoEscape
ทั้งวงเล็บปีกกาและเครื่องหมายแบ็กสแลชจะถูกลบออก
เครื่องหมายทับ (และเครื่องหมายแบ็กสแลชในโหมด windowsPathsNoEscape
) ไม่สามารถหลีกหรือหลีกได้
จับคู่กับรายการไฟล์ในรูปแบบของ fnmatch หรือ glob หากไม่มีสิ่งใดที่ตรงกันและตั้งค่า options.nonull ให้ส่งคืนรายการที่มีรูปแบบนั้นเอง
var 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', { บางส่วน: true }) // true อาจเป็น /a/b/c/dminimatch('/a/b', '/ **/d', { บางส่วน: จริง }) // จริง อาจเป็น /a/b/.../dminimatch('/x/y/z', '/a/**/z', { บางส่วน : true }) // false เพราะ x !== ก
ใช้ เป็นตัวคั่นพาธ เท่านั้น และ ไม่ ใช้เป็นอักขระหลีก หากตั้งค่าไว้
อักขระทั้งหมดจะถูกแทนที่ด้วย
/
ในรูปแบบ โปรดทราบว่าสิ่งนี้ทำให้ ไม่สามารถ จับคู่กับเส้นทางที่มีอักขระรูปแบบ glob ตามตัวอักษร แต่อนุญาตให้จับคู่กับรูปแบบที่สร้างโดยใช้ 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
c แต่ไม่ตรงกับสตริงพา ./a/b/../c
ค . จุดและส่วนเส้นทางว่างในรูปแบบจะยังคงอยู่
2
(หรือสูงกว่า) - การเพิ่มประสิทธิภาพเชิงรุกมากขึ้น เหมาะสำหรับใช้กับเคสการเดินไฟล์:
แม้ว่าการปรับให้เหมาะสมเหล่านี้จะปรับปรุงประสิทธิภาพของกรณีการใช้งานการเดินไฟล์ เช่น glob (นั่นคือ เหตุผลที่โมดูลนี้มีอยู่) ก็มีบางกรณีที่ไม่สามารถจับคู่สตริงตัวอักษรที่จะจับคู่ในระดับการปรับให้เหมาะสม 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
สิ่งนี้จะทริกเกอร์พฤติกรรมเฉพาะของ windows ทั้งหมด (การจัดการพิเศษสำหรับเส้นทาง UNC และถือเป็นตัวคั่นในเส้นทางไฟล์เพื่อการเปรียบเทียบ)
ค่าเริ่มต้นเป็นค่าของ process.platform
แม้ว่าการปฏิบัติตามมาตรฐานที่มีอยู่อย่างเข้มงวดจะเป็นเป้าหมายที่คุ้มค่า แต่ก็ยังมีความคลาดเคลื่อนบางประการระหว่างมินิแมตช์และการใช้งานอื่นๆ บ้างก็ตั้งใจและบ้างก็หลีกเลี่ยงไม่ได้
หากรูปแบบเริ่มต้นด้วย !
ตัวละครแล้วมันถูกปฏิเสธ ตั้งค่าสถานะ nonegate
เพื่อระงับพฤติกรรมนี้ และปฏิบัติต่อ Leading !
ตัวอักษรตามปกติ นี่อาจจะเกี่ยวข้องหากคุณต้องการเริ่มรูปแบบด้วยรูปแบบ extglob เชิงลบเช่น !(a|B)
หลายรายการ !
อักขระที่จุดเริ่มต้นของรูปแบบจะลบล้างรูปแบบหลายครั้ง
หากรูปแบบขึ้นต้นด้วย #
จะถือว่าเป็นความคิดเห็น และจะไม่ตรงกับสิ่งใดเลย ใช้ #
เพื่อจับคู่ตัวอักษร #
ที่จุดเริ่มต้นของบรรทัด หรือตั้งค่าสถานะ nocomment
เพื่อระงับการทำงานนี้
อักขระดาวคู่ **
ได้รับการสนับสนุนตามค่าเริ่มต้น เว้นแต่จะตั้งค่าสถานะ noglobstar
สิ่งนี้ได้รับการสนับสนุนในลักษณะของ bsdglob และ bash 4.1 โดยที่ **
มีความสำคัญพิเศษเฉพาะในกรณีที่เป็นสิ่งเดียวในส่วนเส้นทาง นั่นคือ a/**/b
จะจับคู่ a/x/y/b
แต่ a/**b
จะไม่จับคู่
หากรูปแบบที่ใช้ Escape ไม่มีค่าที่ตรงกัน และมีการตั้งค่าแฟล็ก nonull
ดังนั้น minimatch.match จะส่งคืนรูปแบบตามที่ให้ไว้ แทนที่จะตีความค่า Escape ของอักขระ ตัวอย่างเช่น minimatch.match([], "*a?")
จะส่งกลับ "*a?"
แทนที่จะเป็น "*a?"
- สิ่งนี้คล้ายกับการตั้งค่าตัวเลือก nullglob
ใน bash ยกเว้นว่าไม่สามารถแก้ไขอักขระรูปแบบที่หลีกเลี่ยงได้
หากไม่ได้ปิดใช้งานส่วนขยายปีกกา จะดำเนินการก่อนการตีความรูปแบบ glob อื่นใด ดังนั้นรูปแบบเช่น +(a|{b),c)}
ซึ่งจะไม่ถูกต้องใน bash หรือ zsh จะถูกขยาย ก่อน ในชุดของ +(a|b)
และ +(a|c)
และเหล่านั้น มีการตรวจสอบรูปแบบเพื่อความถูกต้อง เนื่องจากทั้งสองถูกต้อง รายได้ที่ตรงกัน
รูปแบบ extglob ที่ถูกลบได้รับการจัดการอย่างใกล้ชิดที่สุดเท่าที่จะเป็นไปได้กับซีแมนทิกส์ของ Bash แต่มีบางกรณีที่มี extglobs ที่เป็นค่าลบซึ่งเป็นเรื่องยากมากที่จะแสดงในนิพจน์ทั่วไปของ JavaScript โดยเฉพาะอย่างยิ่งรูปแบบที่ถูกปฏิเสธ <start>!(<pattern>*|)*
จะตรงกับสิ่งใดก็ตามที่ไม่ได้ขึ้นต้นด้วย <start><pattern>
อย่างไรก็ตาม <start>!(<pattern>*)*
จะ จับคู่เส้นทางที่ขึ้นต้นด้วย <start><pattern>
เนื่องจากสตริงว่างสามารถจับคู่กับส่วนที่ถูกปฏิเสธได้ ในไลบรารีนี้ <start>!(<pattern>*|)*
จะ ไม่ ตรงกับรูปแบบใด ๆ ที่ขึ้นต้นด้วย <start>
เนื่องจากความแตกต่างอย่างแม่นยำว่ารูปแบบใดที่ถือว่า "โลภ" ในนิพจน์ทั่วไปเทียบกับการขยายเส้นทางทุบตี สิ่งนี้อาจแก้ไขได้ แต่ก็ไม่ทำให้เกิดความซับซ้อนและต้นทุนด้านประสิทธิภาพ และการแลกเปลี่ยนดูเหมือนจะไม่คุ้มที่จะดำเนินการ
โปรดทราบว่า fnmatch(3)
ใน libc เป็นตัวจับคู่การเปรียบเทียบสตริงที่ไร้เดียงสาอย่างยิ่ง ซึ่งไม่ได้ทำอะไรเป็นพิเศษสำหรับเครื่องหมายสแลช ไลบรารีนี้ได้รับการออกแบบเพื่อใช้ในการค้นหา glob และไฟล์วอล์คเกอร์ และดังนั้นจึงทำสิ่งพิเศษด้วย /
ดังนั้น foo*
จะไม่จับคู่ foo/bar
ในไลบรารีนี้ แม้ว่าจะอยู่ใน fnmatch(3)
ก็ตาม