เลือกอนุญาตให้เลือกตัวละคร '|' ในหมู่ผู้สมัครสองคนขึ้นไป ด้วยการขยายการแสดงออกปกติของชื่อบทมันสามารถขยายเข้าไปในนิพจน์ที่ใช้มากกว่าเพียงแค่ชื่อบท อย่างไรก็ตามสิ่งนี้ไม่ได้ตรงตามที่คาดไว้ เมื่อใช้การเลือกการแสดงออกที่เป็นไปได้มากที่สุดสำหรับแต่ละด้านของตัวละคร '|' จะถูกจับคู่ คุณอาจคิดว่านิพจน์ JScript และ VBScript ต่อไปนี้จะตรงกับ 'บท' หรือ 'ส่วน' ที่ตำแหน่งเริ่มต้นและจุดสิ้นสุดของแถวและตามด้วยหนึ่งหรือสองหมายเลข:
/^Chapter|Section [1-9][0-9]{0,1}$/ ^Chapter|Section [1-9][0-9]{0,1}___FCKpd___0quot;น่าเสียดายที่กรณีจริงคือนิพจน์ทั่วไปที่แสดงด้านบนตรงกับคำว่า 'บท' ที่จุดเริ่มต้นของบรรทัดหรือตรงกับ 'ส่วน' ในตอนท้ายของบรรทัดตามด้วยหมายเลขใด ๆ หากสตริงอินพุตคือ 'บทที่ 22' นิพจน์ด้านบนจะตรงกับคำว่า 'บท' เท่านั้น หากสตริงอินพุตคือ 'ส่วนที่ 22' นิพจน์จะตรงกับ 'ส่วนที่ 22' แต่ผลลัพธ์นี้ไม่ใช่จุดประสงค์ของเราที่นี่ดังนั้นจะต้องมีวิธีที่จะทำให้การแสดงออกเป็นประจำตอบสนองต่อสิ่งที่พวกเขากำลังจะทำและมีวิธีการเช่นนี้
วงเล็บสามารถใช้เพื่อ จำกัด ช่วงของตัวเลือกนั่นคือเป็นที่ชัดเจนว่าตัวเลือกใช้กับสองคำว่า 'บท' และ 'ส่วน' เท่านั้น อย่างไรก็ตามวงเล็บก็เป็นเรื่องยากที่จะจัดการเพราะพวกเขายังใช้ในการสร้างการแสดงออกของย่อยและบางส่วนจะได้รับการแนะนำในภายหลังในส่วนของการแสดงออกของ subexpressions โดยการแสดงออกปกติที่แสดงด้านบนและเพิ่มวงเล็บในตำแหน่งที่เหมาะสมการแสดงออกปกติสามารถทำเพื่อให้ตรงกับทั้ง 'บทที่ 1' และ 'ส่วนที่ 3'
นิพจน์ทั่วไปต่อไปนี้ใช้วงเล็บในการจัดกลุ่ม 'บท' และ 'ส่วน' เพื่อให้นิพจน์ทำงานได้อย่างถูกต้อง สำหรับ jscript:
/^(Chapter|Section) [1-9][0-9]{0,1}$/สำหรับ vbscript:
^(Chapter|Section) [1-9][0-9]{0,1}___FCKpd___2quot;นิพจน์เหล่านี้ทำงานได้อย่างถูกต้องและผลิตผลพลอยได้ที่น่าสนใจ การวางวงเล็บบนทั้งสองด้านของ 'บท | ส่วน' สร้างการจัดกลุ่มที่เหมาะสม แต่ยังทำให้หนึ่งในสองคำที่ถูกจับคู่เพื่อจับกุมเพื่อใช้ในอนาคต เนื่องจากมีชุดวงเล็บเพียงชุดเดียวในนิพจน์ที่แสดงด้านบนจึงสามารถมี การจับ ที่ถูกจับได้เพียงอันเดียว การส่งข้อมูลนี้สามารถอ้างอิงได้โดยใช้คอลเลกชัน Submatches ของ VBScript หรือแอตทริบิวต์ $ 1- $ 9 ของวัตถุ Regexp ใน JScript
บางครั้งการจับการแข่งขันย่อยเป็นที่ต้องการบางครั้งก็ไม่พึงปรารถนา ในตัวอย่างที่แสดงในคำอธิบายสิ่งที่คุณต้องการทำจริงๆคือการใช้วงเล็บในการจัดกลุ่มตัวเลือกระหว่างคำว่า 'บท' หรือ 'ส่วน' ไม่พึงปรารถนาที่จะอ้างถึงการแข่งขันในภายหลัง อันที่จริงโปรดอย่าใช้เว้นแต่คุณจะต้องจับภาพการแข่งขันย่อย นิพจน์ทั่วไปนี้จะมีประสิทธิภาพมากขึ้นเพราะไม่ต้องใช้เวลาและหน่วยความจำในการจัดเก็บการแข่งขันย่อยเหล่านั้น
คุณสามารถใช้ '?:' ด้านหน้าของรูปแบบการแสดงออกปกติวงเล็บเพื่อป้องกันการจัดเก็บการจับคู่นี้เพื่อการใช้งานในอนาคต การดัดแปลงต่อไปนี้ไปยังนิพจน์ทั่วไปที่แสดงด้านบนให้ฟังก์ชั่นเดียวกับที่กำจัดการจัดเก็บที่ส่ง สำหรับ jscript:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/สำหรับ vbscript:
^(?:Chapter|Section) [1-9][0-9]{0,1}___FCKpd___4quot;นอกเหนือจาก '?:' Metacharacter แล้วยังมี metacharacters ที่ไม่ได้จับสองตัวที่ใช้ในการจับคู่ที่เรียกว่า ก่อนการตรวจสอบ การตรวจสอบล่วงหน้าล่วงหน้าจะถูกแสดงโดย? = โดยที่รูปแบบการแสดงออกปกติในวงเล็บเริ่มจับคู่สตริงการค้นหา การตรวจสอบล่วงหน้าเชิงลบจะถูกระบุโดย '?!' เพื่อให้ตรงกับสตริงการค้นหาที่ตำแหน่งใด ๆ ที่ไม่ตรงกับรูปแบบการแสดงออกปกติที่จุดเริ่มต้น
ตัวอย่างเช่นสมมติว่ามีเอกสารที่มีการอ้างอิงถึง Windows 3.1, Windows 95, Windows 98 และ Windows NT เพิ่มเติมสมมติว่าเอกสารจำเป็นต้องได้รับการปรับปรุงโดยมองหาการอ้างอิงทั้งหมดไปยัง Windows 95, Windows 98 และ Windows NT และเปลี่ยนการอ้างอิงเหล่านี้เป็น Windows 2000 คุณสามารถใช้นิพจน์ปกติ JScript ต่อไปนี้ซึ่งเป็นการตรวจสอบล่วงหน้าล่วงหน้าเพื่อให้ตรงกับ Windows 95, Windows 98 และ Windows NT:
/Windows(?=95 |98 |NT )/ ในการสร้างการจับคู่เดียวกันใน vbscript คุณสามารถใช้นิพจน์ต่อไปนี้: Windows(?=95 |98 |NT )
เมื่อพบการจับคู่การค้นหาการแข่งขันครั้งต่อไปจะเริ่มขึ้นทันทีหลังจากข้อความที่ตรงกัน (ไม่รวมถึงอักขระที่ใช้ในการตรวจสอบก่อน) ตัวอย่างเช่นหากนิพจน์ที่แสดงด้านบนตรงกับ 'Windows 98' การค้นหาจะดำเนินการต่อจาก 'windows' แทน '98'
หนึ่งในคุณสมบัติที่สำคัญที่สุดของนิพจน์ทั่วไปคือความสามารถในการจัดเก็บส่วนหนึ่งของรูปแบบที่ประสบความสำเร็จในการจับคู่สำหรับการใช้งานในภายหลัง โปรดจำไว้ว่าการเพิ่มวงเล็บเข้ากับทั้งสองด้านของรูปแบบการแสดงออกปกติหรือรูปแบบบางส่วนจะทำให้การแสดงออกบางส่วนถูกเก็บไว้ในบัฟเฟอร์ชั่วคราว metacharacters ที่ไม่ได้จับตามอง '?:', '? =' หรือ '?!' สามารถใช้เพื่อเพิกเฉยต่อการจัดเก็บของส่วนนี้ของนิพจน์ทั่วไป
แต่ละรายการที่จับได้จะถูกเก็บไว้เป็นเนื้อหาที่พบจากซ้ายไปขวาในรูปแบบการแสดงออกปกติ หมายเลขบัฟเฟอร์ที่เก็บการแข่งขันย่อยเริ่มต้นที่ 1 และมีหมายเลขติดต่อกันจนถึงการแสดงออกย่อยสูงสุด 99 แต่ละบัฟเฟอร์สามารถเข้าถึงได้โดยใช้ '/ n ' โดยที่ n คือหมายเลขทศนิยมหนึ่งหลักหนึ่งหรือสองหลักที่ระบุบัฟเฟอร์เฉพาะ
การอ้างอิงย้อนหลังหนึ่งในแอพพลิเคชั่นที่ง่ายที่สุดและมีประโยชน์ที่สุดคือความสามารถในการพิจารณาว่าคำสองคำที่เหมือนกันปรากฏในข้อความอย่างต่อเนื่อง โปรดดูประโยคต่อไปนี้:
Is is the cost of of gasoline going up up?ตามเนื้อหาที่เป็นลายลักษณ์อักษรประโยคข้างต้นเห็นได้ชัดว่ามีปัญหาของคำซ้ำ ๆ ซ้ำ ๆ มันจะดีถ้ามีวิธีแก้ไขประโยคโดยไม่ต้องมองหาการทำซ้ำของแต่ละคำ นิพจน์ปกติของ JScript ต่อไปนี้สามารถบรรลุฟังก์ชั่นนี้โดยใช้ subexpression
//b([az]+) /1/b/giนิพจน์ VBScript ที่เทียบเท่าคือ:
/b([az]+) /1/bในตัวอย่างนี้การแสดงออกของ subexpression คือแต่ละรายการระหว่างวงเล็บ นิพจน์ที่ถูกจับรวมถึงอักขระตัวอักษรหนึ่งตัวหรือมากกว่าคือที่ระบุโดย '[AZ]+' ส่วนที่สองของนิพจน์ทั่วไปคือการอ้างอิงถึงการแข่งขันย่อยที่จับก่อนหน้านี้นั่นคือการเกิดขึ้นครั้งที่สองของคำที่ตรงกับนิพจน์เพิ่มเติม '/1' ใช้เพื่อระบุการส่งครั้งแรก อักขระองค์ประกอบขอบเขตของ Word ตรวจสอบให้แน่ใจว่ามีการตรวจพบคำเฉพาะเท่านั้น ถ้าไม่เป็นวลีเช่นออกมาหรือจะได้รับการยอมรับอย่างไม่ถูกต้องโดยนิพจน์
ในนิพจน์ jscript, Global Flag ('G') ตามนิพจน์ปกติหมายความว่านิพจน์จะถูกใช้เพื่อค้นหาการจับคู่ให้มากที่สุดเท่าที่จะทำได้ในสตริงอินพุต ความไวของตัวพิมพ์ใหญ่ถูกระบุโดยเครื่องหมายความไวของเคส ('i') ในตอนท้ายของการแสดงออก แท็กหลายบรรทัดระบุการจับคู่ที่อาจเกิดขึ้นที่อาจปรากฏที่ปลายทั้งสองของอักขระใหม่ สำหรับ VBScript แท็กต่าง ๆ ไม่สามารถตั้งค่าในนิพจน์ได้ แต่จะต้องตั้งค่าอย่างชัดเจนโดยใช้คุณสมบัติของวัตถุ Regexp
การใช้นิพจน์ทั่วไปที่แสดงด้านบนรหัส JScript ต่อไปนี้สามารถแทนที่คำเดียวกันที่ปรากฏสองครั้งในสตริงตัวอักษรที่มีคำเดียวกันโดยใช้ข้อมูลการแข่งขันย่อย:
. var rv = ss.replace(re,$1); //var ss = Is is the cost of of gasoline going up up?./n; var re = //b([az]+) /1/b/gim; //.. var rv = ss.replace(re,$1); //
รหัส VBScript ที่ใกล้เคียงที่สุดมีดังนี้:
Dim ss, re, rv ss = Is is the cost of of gasoline going up up?. & vbNewLine Set re = New RegExp re.Pattern = /b([az]+) /1/b re.Global = True re.IgnoreCase = True re.MultiLine = True rv = re.Replace(ss,$1)โปรดทราบว่าในรหัส VBScript, Global, Case Sensitivity และ Tags หลายบรรทัดถูกตั้งค่าโดยใช้คุณสมบัติที่เหมาะสมของวัตถุ Regexp
ใช้ $ 1 ในวิธี การแทนที่ เพื่ออ้างอิงการส่งครั้งแรกที่บันทึกไว้ หากมีการจับคู่ย่อยหลายรายการคุณสามารถอ้างอิงต่อไปด้วย $ 2 , $ 3 ฯลฯ
การใช้การอ้างอิงย้อนหลังอีกครั้งคือการทำลายตัวบ่งชี้ทรัพยากรทั่วไป (URI) เป็นส่วนประกอบ สมมติว่าคุณต้องการย่อยสลาย URI ต่อไปนี้เป็นโปรโตคอล (FTP, HTTP, ฯลฯ ) ที่อยู่ชื่อโดเมนและหน้า/เส้นทาง:
http://msdn.microsoft.com:80/scripting/default.htmนิพจน์ปกติต่อไปนี้สามารถให้ฟังก์ชั่นนี้ได้ สำหรับ JScript, AS:
/(/w+):////([^/:]+)(:/d*)?([^# ]*)/สำหรับ vbscript:
(/w+):////([^/:]+)(:/d*)?([^# ]*)subexpression เพิ่มเติมครั้งแรกใช้เพื่อจับส่วนโปรโตคอลของที่อยู่เว็บ การแสดงออกของ subexpression นี้ตรงกับคำใด ๆ ที่อยู่ก่อนลำไส้ใหญ่และสอง slashes ไปข้างหน้า subexpression เพิ่มเติมครั้งที่สองจับที่อยู่ชื่อโดเมนของที่อยู่นั้น การแสดงออกย่อยนี้ตรงกับลำดับอักขระใด ๆ ที่ไม่รวม '^', '/' หรือ ':' อักขระ subexpression เพิ่มเติมที่สามจะจับหมายเลขพอร์ตเว็บไซต์หากระบุหมายเลขพอร์ต การแสดงออกของ subexpression นี้ตรงกับตัวเลขศูนย์หรือมากกว่าตามด้วยลำไส้ใหญ่ ในที่สุดการแสดงออกของ subexpression เพิ่มเติมครั้งที่สี่จะจับพา ธ ที่ระบุโดยที่อยู่เว็บและ/หรือข้อมูลหน้า การแสดงออกย่อยนี้ตรงกับอักขระหนึ่งและหลายตัวยกเว้น '#' หรือพื้นที่
หลังจากใช้นิพจน์ทั่วไปนี้กับ URI ที่แสดงด้านบนการแข่งขันย่อยจะมีสิ่งต่อไปนี้:
regexp. $ 1 มี http
regexp. $ 2 มี msdn.microsoft.com
Regexp. $ 3 รวมถึง: 80
regexp. $ 4 มี /scripting/default.htm