บางครั้งฉันก็ไม่รู้ว่ามีตัวละครกี่ตัวที่ตรงกัน เพื่อให้สามารถปรับให้เข้ากับความไม่แน่นอนนี้การแสดงออกปกติสนับสนุนแนวคิดของการคัดเลือก ผู้คัดเลือกเหล่านี้สามารถระบุจำนวนเวลาที่กำหนดของนิพจน์ทั่วไปจะต้องปรากฏขึ้นก่อนที่จะสามารถตอบสนองการแข่งขันได้กี่ครั้ง
ตารางต่อไปนี้ให้คำอธิบายเกี่ยวกับผู้คัดเลือกและความหมายต่าง ๆ :
| อักขระ | อธิบาย |
|---|---|
| - | ตรงกับ Subexpression Zero ก่อนหน้าหรือหลายครั้ง ตัวอย่างเช่น Zo* สามารถจับคู่ Z และ Zoo * เทียบเท่ากับ {0,} |
| - | ตรงกับการแสดงออกของ subexpression ก่อนหน้าหนึ่งครั้งหรือมากกว่า ตัวอย่างเช่น 'Zo+' สามารถจับคู่ ZO และ Zoo แต่ไม่ใช่ Z + เทียบเท่ากับ {1,} |
| - | ตรงกับศูนย์ย่อยก่อนหน้านี้เป็นศูนย์หรือหนึ่งครั้ง ตัวอย่างเช่น Do (ES) สามารถจับคู่หรือทำในทำ เทียบเท่ากับ {0,1} |
| { n } | n เป็นจำนวนเต็มที่ไม่เป็นลบ จับคู่ n ครั้งที่กำหนด ตัวอย่างเช่น 'o {2}' ไม่สามารถจับคู่ 'o' ใน Bob แต่สามารถจับคู่ระบบปฏิบัติการสองระบบในอาหาร |
| { n ,} | n เป็นจำนวนเต็มที่ไม่เป็นลบ จับคู่อย่างน้อย n ครั้ง ตัวอย่างเช่น 'o {2,}' ไม่สามารถจับคู่ 'o' ใน Bob แต่สามารถจับคู่ระบบปฏิบัติการทั้งหมดใน foooood ได้ 'o {1,}' เทียบเท่ากับ 'o+' 'o {0,}' เทียบเท่ากับ 'o*' |
| { n , m } | ทั้ง M และ N เป็นจำนวนเต็มที่ไม่เป็นลบโดยที่ n <= m จับคู่อย่างน้อย n ครั้งและจับคู่ถึง M ครั้ง Liu, O {1,3} จะตรงกับระบบปฏิบัติการสามระบบแรกใน Fooooood 'o {0,1}' เทียบเท่ากับ 'o?' โปรดทราบว่าไม่สามารถมีช่องว่างระหว่างเครื่องหมายจุลภาคและตัวเลขสองตัว |
สำหรับเอกสารอินพุตขนาดใหญ่จำนวนบทสามารถเกินเก้าบทได้อย่างง่ายดายดังนั้นจึงมีวิธีจัดการกับหมายเลขบทสองหลักหรือสามหลัก รอบคัดเลือกมีฟังก์ชั่นนี้ นิพจน์ปกติของ JScript ต่อไปนี้สามารถจับคู่ชื่อบทกับจำนวนบิตใด ๆ :
/Chapter [1-9][0-9]*/นิพจน์ปกติของ VBScript ต่อไปนี้ทำการจับคู่เดียวกัน:
Chapter [1-9][0-9]*โปรดทราบว่าผู้คัดเลือกจะปรากฏขึ้นหลังจากการแสดงออกของช่วง ดังนั้นจะถูกนำไปใช้กับนิพจน์ช่วงทั้งหมดที่มีอยู่ในกรณีนี้มีการระบุตัวเลขเฉพาะจาก 0 ถึง 9 เท่านั้น
ไม่ได้ใช้ตัวคัดเลือก '+' ที่นี่เนื่องจากไม่จำเป็นต้องใช้ตัวเลขในตำแหน่งที่สองหรือที่ตามมา ยังไม่ได้ใช้ตัวละคร '? อย่างน้อยหนึ่งหมายเลขควรจับคู่หลังจาก 'บท' และอักขระอวกาศ
หากข้อ จำกัด ของบทเป็น 99 บทคุณสามารถใช้นิพจน์ JScript ต่อไปนี้เพื่อระบุหมายเลขอย่างน้อยหนึ่งหมายเลข แต่ไม่เกินสองตัวเลข
/Chapter [0-9]{1,2}/สำหรับ VBScript สามารถใช้นิพจน์ทั่วไปต่อไปนี้ได้:
Chapter [0-9]{1,2}ข้อเสียของนิพจน์ข้างต้นคือหากมีหมายเลขบทที่มากกว่า 99 มันจะยังคงตรงกับตัวเลขสองหลักแรกเท่านั้น ข้อเสียเปรียบอีกประการหนึ่งคือบางคนสามารถสร้างบทที่ 0 และยังคงตรงกับ นิพจน์ JScript ที่ดีกว่าเพื่อให้ตรงกับตัวเลขสองหลักมีดังนี้:
/Chapter [1-9][0-9]?/หรือ
/Chapter [1-9][0-9]{0,1}/สำหรับ VBScript นิพจน์ต่อไปนี้เทียบเท่ากับด้านบน:
Chapter [1-9][0-9]?หรือ
Chapter [1-9][0-9]{0,1} ' * ' , ' +' และ ' ?' บางครั้งนี่ไม่ใช่สิ่งที่คุณต้องการเกิดขึ้นเลย บางครั้งมันก็เกิดขึ้นกับการแข่งขันที่เล็กที่สุด
ตัวอย่างเช่นคุณอาจต้องการค้นหาเอกสาร HTML เพื่อค้นหาชื่อบทที่รวมอยู่ในแท็ก H1 ในเอกสารข้อความอาจมีแบบฟอร์มต่อไปนี้:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>นิพจน์ต่อไปนี้ตรงกับทุกอย่างตั้งแต่ต้นน้อยกว่าเครื่องหมาย (<) จนถึงจุดสิ้นสุดของเครื่องหมาย H1
/<.*>/การแสดงออกปกติของ VBScript คือ:
<.*>หากสิ่งที่ต้องจับคู่คือแท็ก H1 เริ่มต้นการแสดงออกที่ไม่ใช่แบบกำหนดต่อไปนี้จะตรงกับ <H1> เท่านั้น
/<.*?>/หรือ
<.*?>โดยการวาง '?' หลังจาก '*', '+' หรือ '?
จนถึงขณะนี้ตัวอย่างที่เห็นเท่านั้นพิจารณาค้นหาชื่อบทที่ปรากฏทุกที่ สตริง 'บท' ใด ๆ ที่ปรากฏตามด้วยพื้นที่และตัวเลขอาจเป็นชื่อบทจริงหรืออ้างอิงข้ามกับบทอื่น ๆ เนื่องจากชื่อบทที่แท้จริงจะปรากฏขึ้นที่จุดเริ่มต้นของบรรทัดเสมอจึงจำเป็นต้องออกแบบวิธีการค้นหาเฉพาะชื่อและไม่ใช่การอ้างอิงข้าม
ตัวระบุตำแหน่งให้ฟังก์ชั่นนี้ ตัวระบุตำแหน่งสามารถแก้ไขนิพจน์ทั่วไปได้ที่จุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัด นอกจากนี้คุณยังสามารถสร้างนิพจน์ทั่วไปที่ปรากฏภายในคำหรือเฉพาะที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำ ตารางต่อไปนี้มีรายการนิพจน์ทั่วไปและความหมายของพวกเขา:
| อักขระ | อธิบาย |
|---|---|
| - | ตรงกับตำแหน่งเริ่มต้นของสตริงอินพุต หากมีการตั้งค่าคุณสมบัติ multiline ของวัตถุ Regexp แล้ว ^ จะตรงกับตำแหน่งหลังจาก '/n' หรือ '/r' |
| - | ตรงกับตำแหน่งสิ้นสุดของสตริงอินพุต หากมีการตั้งค่าคุณสมบัติ multiline ของวัตถุ Regexp แล้ว $ จะตรงกับตำแหน่งก่อน '/n' หรือ '/r' |
| /B | จับคู่ขอบเขตคำซึ่งหมายถึงตำแหน่งระหว่างคำและพื้นที่ |
| /B | ตรงกับขอบเขตที่ไม่ใช่คำ |
ไม่สามารถใช้รอบคัดเลือกสำหรับตัวระบุตำแหน่ง เนื่องจากจะไม่มีตำแหน่งติดต่อกันก่อนหรือหลังขอบเขตใหม่หรือขอบเขตคำจะไม่อนุญาตให้มีการแสดงออกเช่น '^*'
ในการจับคู่ข้อความที่จุดเริ่มต้นของบรรทัดข้อความให้ใช้อักขระ '^' ที่จุดเริ่มต้นของนิพจน์ทั่วไป อย่าสับสนกับไวยากรณ์ของ '^' ด้วยไวยากรณ์ในการแสดงออกของวงเล็บ ไวยากรณ์ของพวกเขาแตกต่างกันโดยพื้นฐาน
ในการจับคู่ข้อความที่ส่วนท้ายของบรรทัดข้อความให้ใช้อักขระ '$' ในตอนท้ายของนิพจน์ทั่วไป
หากต้องการใช้ตัวระบุตำแหน่งเมื่อมองหาชื่อบทนิพจน์ JScript ปกติต่อไปนี้จะตรงกับชื่อบทที่มีตัวเลขสูงสุดสองตัวที่จุดเริ่มต้นของบรรทัด:
/^Chapter [1-9][0-9]{0,1}/นิพจน์ปกติสำหรับฟังก์ชั่นเดียวกันใน VBScript มีดังนี้:
^Chapter [1-9][0-9]{0,1}ชื่อบทที่แท้จริงไม่เพียง แต่ปรากฏขึ้นที่จุดเริ่มต้นของบรรทัด แต่ยังมีเพียงเนื้อหานี้ในบรรทัดนี้ดังนั้นจึงต้องอยู่ในตอนท้ายของบรรทัด นิพจน์ต่อไปนี้ทำให้มั่นใจได้ว่าการจับคู่ที่ระบุตรงกับบทเท่านั้นและไม่ตรงกับการอ้างอิงข้าม มันสามารถทำได้โดยการสร้างนิพจน์ทั่วไปที่ตรงกับตำแหน่งเริ่มต้นและจุดสิ้นสุดของบรรทัดตัวอักษร
/^Chapter [1-9][0-9]{0,1}$/สำหรับ vbscript ใช้:
^Chapter [1-9][0-9]{0,1}___FCKpd___16quot;ขอบเขตคำที่ตรงกันนั้นแตกต่างกันเล็กน้อย แต่มันเพิ่มฟังก์ชั่นที่สำคัญมากให้กับนิพจน์ทั่วไป ขอบเขตคำคือตำแหน่งระหว่างคำและช่องว่าง ขอบเขตที่ไม่ใช่คำเป็นที่อื่น นิพจน์ jscript ต่อไปนี้จะตรงกับอักขระสามตัวแรกของคำว่า 'บท' เพราะปรากฏหลังจากขอบเขตคำ:
//bCha/สำหรับ vbscript:
/bChaตำแหน่งของตัวดำเนินการ '/b' มีความสำคัญที่นี่ หากเป็นจุดเริ่มต้นของสตริงที่จะจับคู่การจับคู่ที่จุดเริ่มต้นของคำจะถูกมองหา; ตัวอย่างเช่นนิพจน์ต่อไปนี้จะตรงกับ 'ter' ในคำว่า 'บท' เพราะมันปรากฏขึ้นก่อนขอบเขตคำ:
/ter/b/เช่นเดียวกับ
ter/bนิพจน์ต่อไปนี้จะตรงกับ 'APT' เพราะมันอยู่ตรงกลางของ 'บท' แต่จะไม่ตรงกับ 'APT' ใน 'ความถนัด':
//Bapt/เช่นเดียวกับ
/Baptนี่เป็นเพราะ 'APT' ปรากฏในตำแหน่งขอบเขตที่ไม่ใช่คำในคำว่า 'บท' และในคำว่า 'ความถนัด' ตำแหน่งของผู้ให้บริการขอบเขตที่ไม่ใช่คำไม่สำคัญเนื่องจากการแข่งขันไม่มีส่วนเกี่ยวข้องกับการเริ่มต้นหรือจุดสิ้นสุดของคำ