คำก่อนหน้านี้
ไวยากรณ์พื้นฐานของนิพจน์ทั่วไปใน JavaScript ได้รับการแนะนำก่อนหน้านี้ คลาส regexp ของ JavaScript แสดงถึงการแสดงออกปกติ ทั้งสตริงและ regexp กำหนดวิธีการ การใช้นิพจน์ทั่วไปสามารถทำการจับคู่รูปแบบที่ทรงพลังการดึงข้อความและการเปลี่ยน บทความนี้จะแนะนำวัตถุ regexp ของการแสดงออกปกติและการแสดงออกปกติที่เกี่ยวข้อง
คุณลักษณะและวิธีการ
วัตถุ
การแสดงออกปกติใน JavaScript จะแสดงโดยวัตถุ Regexp และมีสองวิธีในการเขียน: หนึ่งคือวิธีการตามตัวอักษร; อีกวิธีหนึ่งคือวิธีการสร้าง
วิธีการเขียน Perl
การเขียนการแสดงออกอย่างสม่ำเสมอหรือที่เรียกว่าการเขียน Perl เนื่องจากลักษณะการแสดงออกปกติของ JavaScript นั้นยืมมาจาก Perl
ตัวอักษรนิพจน์ทั่วไปถูกกำหนดเป็นอักขระที่มีอยู่ระหว่างคู่ของ slashes (/) และ 3 ธงสามารถตั้งค่าได้
var expression = /pattern /flags;
รูปแบบการจับคู่ของนิพจน์ทั่วไปรองรับ 3 ธงต่อไปนี้:
G: หมายถึงรูปแบบระดับโลกเช่นรูปแบบจะถูกนำไปใช้กับสตริงทั้งหมดแทนที่จะหยุดทันทีเมื่อพบการแข่งขันครั้งแรก
I: ระบุโหมดตัวพิมพ์เล็กกรณีนั่นคือกรณีของรูปแบบและสตริงจะถูกละเว้นเมื่อพิจารณาการจับคู่
M: แสดงถึงรูปแบบ multiline นั่นคือเมื่อถึงจุดสิ้นสุดของบรรทัดข้อความมันจะยังคงมองหาว่ามีรายการที่ตรงกับรูปแบบในบรรทัดถัดไปหรือไม่
// จับคู่อินสแตนซ์ทั้งหมดของ 'at' ของสตริง var p =/at/g; // test () วิธีการส่งคืนค่าบูลีนเพื่อระบุว่าการจับคู่สามารถพบ console.log (p.test ('ata')); // trueconsole.log (p.test ('aba');regexp constructor
เช่นเดียวกับวัตถุในตัวทั่วไปวัตถุนิพจน์ปกติของ Regexp ยังรองรับรูปแบบของตัวสร้าง+regexp () ใหม่
ตัวสร้าง Regexp ได้รับพารามิเตอร์สองพารามิเตอร์: รูปแบบสตริงที่จะจับคู่และสตริง FLAG แบบเสริม (FLAG) ธงสามธงของสตริงธงและตัวอักษรมีความหมายเหมือนกัน: 'g', 'i', 'm'
พารามิเตอร์ทั้งสองของตัวสร้าง Regexp คือสตริง และการแสดงออกใด ๆ ที่กำหนดโดยใช้รูปแบบตัวอักษรสามารถใช้ตัวสร้าง
// จับคู่อินสแตนซ์ทั้งหมดของ 'at' ของสตริง var p1 =/at/g; // เหมือนกับข้างต้น var p2 = new regexp ('at', 'g');[หมายเหตุ] ข้อกำหนด ECMAScript3 กำหนดว่าปริมาณโดยตรงนิพจน์ปกติจะถูกแปลงเป็นวัตถุ regexp เมื่อดำเนินการกับมัน การดำเนินการแต่ละครั้งของปริมาณโดยตรงนิพจน์ปกติที่แสดงโดยรหัสเดียวกันส่งคืนวัตถุเดียวกัน ข้อกำหนด ECMAScript5 ทำให้บทบัญญัติตรงกันข้ามและนิพจน์ทั่วไปที่แสดงด้วยรหัสเดียวกันจะถูกนับโดยตรงในแต่ละครั้ง
การดำเนินการทั้งหมดส่งคืนวัตถุใหม่ IE6-8 ได้รับการดำเนินการเสมอตามข้อกำหนดของ ECMAScript5 ดังนั้นจึงไม่มีปัญหาความเข้ากันได้
เนื่องจากตัวอักษรของนิพจน์ทั่วไปไม่รองรับตัวแปรหากตัวแปรปรากฏในนิพจน์ปกติคุณสามารถใช้ตัวสร้าง Regexp เพื่อแยกแยะตัวแปรลงในพารามิเตอร์ของตัวสร้าง Regexp เป็นสตริงประกบ
【เคล็ดลับ】รับองค์ประกอบผ่าน className
ฟังก์ชั่น getByClass (obj, className) {องค์ประกอบ var = obj.getElementByTagname ('*'); var result = []; รูปแบบ var = ใหม่ regexp ('(^| // s)' + classname + '(// s | $)'); สำหรับ (var i = 0; i <elements.length; i ++) {ถ้า (pattern.test (องค์ประกอบ [i] .classname)) {result.push (องค์ประกอบ [i]); }} ส่งคืนผลลัพธ์;}คุณสมบัติอินสแตนซ์
วัตถุอินสแตนซ์ regexp แต่ละรายการมีคุณสมบัติ 5 ต่อไปนี้
Global: ค่าบูลีนระบุว่า Glag -flag glage: ค่าบูลีนระบุว่า I Flag LastIndex: Integer ระบุตำแหน่งอักขระของการเริ่มต้นค้นหาการจับคู่ครั้งต่อไปหรือไม่ มันนับจาก 0 multiline: ค่าบูลีนระบุว่าการตั้งค่าสถานะ msource หรือไม่: การแสดงสตริงของนิพจน์ทั่วไปซึ่งกลับมาในรูปแบบตัวอักษรแทนที่จะเป็นรูปแบบสตริงที่ส่งผ่านในคอนสตรัคเตอร์
รูปแบบ var = new regexp ('// [bc //] ที่', 'i'); console.log (pattern.global); // falseconsole.log (pattern.ignorecase); // true console.log (pattern.multiline); // falseconsole.log (pattern.lastindex); // 0console.log (pattern.source); // '/[bc/] ที่'หากคุณใช้ฟังก์ชั่น exec () หรือ test () ของ regexp และตั้งค่ารูปแบบส่วนกลาง 'g' การจับคู่ของนิพจน์ทั่วไปจะเริ่มจากตำแหน่ง LastIndex และ LastIndex จะถูกรีเซ็ตหลังจากแต่ละการแข่งขันแต่ละครั้งสำเร็จ ด้วยวิธีนี้คุณสามารถวนซ้ำซ้ำ ๆ ในสตริงและค้นหาผลการจับคู่แต่ละรายการในลำดับ อย่างไรก็ตามหากคุณต้องการเรียกใช้วิธี regexp exec () หรือทดสอบ () สำหรับสตริงที่แตกต่างกันตัวแปรนี้อาจนำผลลัพธ์การจับคู่ที่ไม่คาดคิด ดังนั้นเมื่อเปลี่ยนสตริงคุณควรตั้งค่า LastIndex ของ regexp เป็น 0 อย่างชัดเจน
// exec () วิธีการส่งคืนการจับคู่ในอาร์เรย์ var p = // w/g; var s = 'ab'; console.log (p.lastindex); // 0console.log (p.exec); // ['a'] console.log (p.lastindex); // 1console.log ( p.exec (s)); // ['b'] console.log (p.lastindex); // 2console.log (p.exec (s)); // nullconsole.log (p.lastindex); // 0
var p = // w/g; var s1 = 'ab'; var s2 = 'ba'; console.log (p.lastindex); // 0console.log (p.exec (s1)); // ['a'] console.log (p.lastindex); // 1console.log (p.exec (S2));
คุณสมบัติของตัวสร้าง
คุณสมบัติของตัวสร้าง Regexp ถือเป็นคุณสมบัติคงที่ซึ่งแตกต่างกันไปตามการดำเนินการนิพจน์ทั่วไปล่าสุดที่ดำเนินการ
มีสองวิธีในการเข้าถึงพวกเขาคือชื่อแอตทริบิวต์ยาวและชื่อแอตทริบิวต์สั้น ๆ ชื่อแอตทริบิวต์สั้น ๆ ส่วนใหญ่ไม่ใช่ตัวระบุ ECMASCRIPT ที่ถูกต้องดังนั้นพวกเขาจึงต้องเข้าถึงผ่านไวยากรณ์ของวงเล็บสี่เหลี่ยมจัตุรัส
ชื่อแอตทริบิวต์ยาวชื่อแอตทริบิวต์สั้น ๆ อินพุต $ _ สตริงสุดท้ายที่จะจับคู่ LastMatch $ & The Last Match LastParen $+ การแข่งขันนัดสุดท้ายการจับคู่สุดท้ายการจับภาพกลุ่ม LightContext $ `อินพุตข้อความก่อน LastMatch Multiline $* ค่าบูลีนระบุว่านิพจน์ทั้งหมดใช้รูปแบบ Multiline RightContext $ '
การใช้คุณสมบัติเหล่านี้ข้อมูลที่เฉพาะเจาะจงมากขึ้นสามารถดึงออกจากการดำเนินการที่ดำเนินการโดยวิธีการ EXEC () หรือวิธีการทดสอบ ()
// test () ใช้เพื่อทดสอบว่าสตริงตรงกับนิพจน์ทั่วไปและส่งคืนค่าบูลีน var text = 'นี่เป็นฤดูร้อนสั้น ๆ '; var pattern =/(.) hort/g; ถ้า (pattern.test (text)) {console.log (regexp.input); // ' console.log (regexp.rightcontext); // 'ฤดูร้อน' console.log (regexp.lastmatch); // 'short' console.log (regexp.lastparen); // 'sports//regexp.multiline); // console.log (regexp ['$ `']); // 'นี่คือ' console.log (regexp ['$'"]); // 's ฤดูร้อน' console.log (regexp ['$ &']; // 'console.log (regexp [' $+' -JavaScript มีคุณสมบัติ 9 ตัวสร้างสำหรับการจัดเก็บกลุ่มจับภาพ คุณสมบัติเหล่านี้จะมีการเติมโดยอัตโนมัติเมื่อเรียกใช้ EXEC () หรือทดสอบ ()
[หมายเหตุ] ในทางทฤษฎี regexp. $ 0 ที่ควรบันทึกลงในข้อความการจับคู่นิพจน์ทั้งหมดไม่มีอยู่ค่าจะไม่ได้กำหนดไว้
//regexp.$1/regexp.$2/regexp.$3.to regexp. $ 9 ใช้เพื่อจัดเก็บครั้งแรกที่สองวินาทีการจับคู่ที่เก้าการจับภาพ var text = 'นี่เป็นฤดูร้อนสั้น'; รูปแบบ var =/(.. ) หรือ (.)/g; ถ้า (รูปแบบ. console.log (regexp. $ 2); // t}
ตัวอย่างวิธีการ
มี 5 วิธีอินสแตนซ์ของวัตถุ regexp แบ่งออกเป็นสองประเภท รวมถึงสามวิธีทั่วไปของวัตถุ: toString (), tolocalstring (), valueof () และวิธีการจับคู่ปกติของการทดสอบ () และ exec ()
วิธีการทั่วไป
วัตถุ Regexp สืบทอดสามวิธี: toString (), tolocalestring () และค่าของ () ของวัตถุวัตถุ
【 ToString () 】
วิธี TOSTRING () ส่งคืนตัวอักษรของนิพจน์ทั่วไป
【 tolocalestring () 】
วิธี TOLOCALESTRING () ส่งคืนตัวอักษรของนิพจน์ทั่วไป
【ค่าของ () 】
เมธอด Valueof () ส่งคืนวัตถุนิพจน์ทั่วไปเอง
[หมายเหตุ] ไม่ว่านิพจน์ปกติจะถูกสร้างขึ้นมาอย่างไร
รูปแบบ var = ใหม่ regexp ('[bc] ที่', 'gi'); console.log (pattern.toString ()); // '/[bc] at/gi'console.log (pattern.tolocalestring ()); // '/[bc] at/gi'console.log (pattern.valueof ()); ///[bc] at/givar pattern =/[bc] at/gi; console.log (pattern.toString ()); // '/[bc] at/gi'console.log (pattern.tolocalestring ()); // '[bc] at/gi'console.log (pattern.valueof ()); ///[bc] at/giวิธีการจับคู่ปกติ
มีเพียงสองวิธีการจับคู่ปกติสำหรับวัตถุ Regexp: exec () และ test () ตามลำดับ
【 exec () 】
วิธี EXEC () ได้รับการออกแบบมาโดยเฉพาะสำหรับการจับกลุ่มและยอมรับพารามิเตอร์คือสตริงที่จะใช้รูปแบบ จากนั้นส่งคืนอาร์เรย์ที่มีข้อมูลการจับคู่และส่งคืนค่า null หากไม่มีการจับคู่
ในอาร์เรย์การจับคู่รายการแรกคือสตริงที่ตรงกับรูปแบบทั้งหมดและรายการอื่น ๆ เป็นสตริงที่ตรงกับกลุ่มการจับภาพในรูปแบบ หากไม่มีกลุ่มการจับภาพในรูปแบบอาร์เรย์จะมีเพียงหนึ่งเดียว
อาร์เรย์ที่ส่งคืนมีคุณสมบัติเพิ่มเติมสองประการ: ดัชนีและอินพุต ดัชนีหมายถึงการจับคู่อยู่ที่ตำแหน่งของสตริงอินพุตหมายถึงสตริงที่ใช้นิพจน์ทั่วไป
var text = 'แม่และพ่อและลูกและคนอื่น ๆ '; var pattern =/mom (และพ่อ (และที่รัก)?)?/gi; var matches = pattern.exec (ข้อความ); console.log (รูปแบบ, การจับคู่); // pattern.lastindex: 20 // จับคู่ [0]: 'แม่กับแม่และลูก' baby '// matches.index: 0 // matches.input:' แม่และพ่อและลูกและคนอื่น ๆ '
สำหรับวิธี EXEC () แม้ว่าจะตั้งค่าสถานะสากล (G) ในรูปแบบ แต่จะส่งคืนการแข่งขันครั้งละหนึ่งรายการเท่านั้น หากไม่มีการตั้งค่าสถานะทั่วโลกการเรียกใช้ exec () หลายครั้งในสตริงเดียวกันจะส่งคืนข้อมูลของการจับคู่แรกเสมอ ในขณะที่เมื่อตั้งค่าสถานะทั่วโลกการโทรแต่ละครั้งไปยัง exec () จะยังคงค้นหาการจับคู่ใหม่ในสตริง
var text = 'cat, bat, sat, fat'; var pattern1 = /.at/; var matches = pattern1.exec (ข้อความ); console.log (pattern1, matches); // pattern1.lastindex: 0 // matches [0]: 'cat' // matches.index: 0 // matches.input.input: pattern1.exec (ข้อความ); console.log (pattern1, matches); //pattern1.lastindex:0//matches [0 เหมือนกัน: 'cat'//matches.index:0//matches.input:'cat,bat,sat,fat'
var text = 'cat, bat, sat, fat'; var pattern2 = /.at/g; var matches = pattern2.exec (ข้อความ); console.log (pattern2, การจับคู่); //pattern2.lastindex:3//matches [0 เหมือนกัน: 'cat'//matches.index:0//matches.input:'cat,bat,sat,fat'var text =' แมว, sat, fat, fat '; //pattern2.lastindex:7//matches [0 เหมือนกัน :'bat'//matches.index:4//matches.input:'cat,bat,sat,fat '
tips เคล็ดลับ】ใช้วิธี EXEC () เพื่อค้นหาตำแหน่งการจับคู่ทั้งหมดและค่าทั้งหมด
var string = 'j1h342jg24g234j 3g24j1'; var pattern = // d/g; var valuearray = []; // ค่า var indexarray = []; // ตำแหน่ง var temp; ในขณะที่ (temp = pattern.exec (string))! = null) {valuearray.push indexarray.push (temp.index); } // ["1", "3", "4", "2", "2", "4", "2", "3", "4", "3", "2", "4", "1"] [1, 3, 4, 5, 8, 9, 11, 12, 13, 18, 18, 19, 21]【ทดสอบ()】
วิธีการทดสอบ () ใช้เพื่อทดสอบว่านิพจน์ทั่วไปสามารถค้นหาข้อความที่ตรงกันในสตริงรับพารามิเตอร์สตริงและส่งคืนจริงเมื่อจับคู่หรือไม่
var text = '000-00-000'; var pattern = // d {3}-/d {2}-/d {4}/; ถ้า (pattern.test (text)) {console.log ('รูปแบบถูกจับคู่');};ในทำนองเดียวกันเมื่อมีการเรียกวิธีการทดสอบ () คุณสมบัติ LastIndex ของวัตถุ regexp จะเปลี่ยนไป หากมีการระบุรูปแบบส่วนกลางทุกครั้งที่มีการดำเนินการวิธีการทดสอบ () ค่า Offset ของ LastIndex ในสตริงจะพยายามจับคู่ ดังนั้นสตริงที่แตกต่างกันได้รับการตรวจสอบหลายครั้งด้วย regexp เดียวกัน ค่า LastIndex จะต้องตั้งค่าเป็น 0 หลังจากการโทรแต่ละครั้ง
รูปแบบ var = /^/d {4}-/d {2}-/d {2}$/g;console.log(pattern.test('2016-06-23')));//trueconsole.log(pattern.test('2016-06-23')); /^/d {4}-/d {2}-/d {2}$/g;console.log(pattern.test('2016-06-23')));//truepattern.lastindex = 0; console.log 0; console.log (pattern.test ('2016-06-23')); // truepattern.lastindex = 0; console.log (pattern.test ('2016-06-23'));ดังที่ได้กล่าวไว้ก่อนหน้านี้ JavaScript มีคุณสมบัติ 9 ตัวสร้างสำหรับการจัดเก็บกลุ่มจับภาพ คุณสมบัติเหล่านี้จะถูกกรอกโดยอัตโนมัติเมื่อเรียกใช้วิธี exec () หรือ test ()
[หมายเหตุ] ในทางทฤษฎี regexp. $ 0 ที่ควรบันทึกลงในข้อความการจับคู่นิพจน์ทั้งหมดไม่มีอยู่ค่าจะไม่ได้กำหนดไว้
if (/^(/d {4})-(/d {2})-(/d {2}) $/. ทดสอบ ('2016-06-23')) {console.log (regexp. $ 1); // '2016' console.log (regexp. $ 2); // '06' console.log (regexp. $ 0); // undefined}ด้านบนเป็นประเภท JavaScript System_regex Regexp ประเภทคำอธิบายรายละเอียด ฉันหวังว่าทุกคนจะสนับสนุน wulin.com ~