คำศัพท์ที่ใช้ในคำตอบนี้:
- การแข่งขันแสดงให้เห็นผลของการใช้รูปแบบของคุณกับ RegEx
someString.match(regexPattern)
สตริงของคุณเช่นดังนั้น:
- รูปแบบที่จับคู่จะระบุส่วนที่ตรงกันทั้งหมดของสตริงอินพุตซึ่งทั้งหมดอยู่ภายในอาร์เรย์จับคู่ นี่คืออินสแตนซ์ทั้งหมดของรูปแบบของคุณภายในสตริงอินพุต
- กลุ่มที่จับคู่ระบุว่าทุกกลุ่มที่จะจับได้ถูกกำหนดในรูปแบบ RegEx (รูปแบบในวงเล็บเช่นดังนั้น:
/format_(.*?)/g
ซึ่ง(.*?)
จะเป็นกลุ่มที่จับคู่.) เหล่านี้อาศัยอยู่ภายในรูปแบบการจับคู่
ลักษณะ
ที่จะได้รับการเข้าถึงกลุ่มจับคู่ในแต่ละรูปแบบการจับคู่คุณต้องมีฟังก์ชั่นหรือสิ่งที่คล้ายกับย้ำในช่วงการแข่งขัน มีหลายวิธีที่คุณสามารถทำได้เช่นเดียวกับคำตอบอื่น ๆ ที่แสดง คำตอบอื่น ๆ ส่วนใหญ่ใช้การวนรอบสักครู่เพื่อวนซ้ำทุกรูปแบบที่ตรงกันแต่ฉันคิดว่าเราทุกคนรู้ถึงอันตรายที่อาจเกิดขึ้นจากวิธีการนั้น มีความจำเป็นต้องจับคู่กับรูปแบบnew RegExp()
แทนที่จะเป็นเพียงรูปแบบตัวเองซึ่งได้กล่าวถึงในความคิดเห็นเท่านั้น นี่เป็นเพราะ.exec()
วิธีการทำงานคล้ายกับฟังก์ชั่นเครื่องกำเนิดไฟฟ้า - มันหยุดทุกครั้งที่มีการแข่งขันแต่.lastIndex
ยังคงที่จะดำเนินการต่อจากที่นั่นในการ.exec()
โทรครั้งต่อไป
ตัวอย่างรหัส
ด้านล่างนี้เป็นตัวอย่างของฟังก์ชันsearchString
ที่คืนค่ารูปแบบที่ตรงกันArray
ทั้งหมดโดยที่แต่ละรายการจะมีกลุ่มที่จับคู่ทั้งหมดที่มีอยู่ แทนที่จะใช้ a while loop ฉันได้ให้ตัวอย่างโดยใช้ทั้งฟังก์ชั่นและวิธีที่มีประสิทธิภาพมากขึ้นโดยใช้ลูปธรรมดาmatch
Array
Array.prototype.map()
for
รุ่นที่รัดกุม (รหัสน้อยกว่าน้ำตาลประโยคมากขึ้น)
สิ่งเหล่านี้มีประสิทธิภาพน้อยกว่าเนื่องจากใช้forEach
-loop แทนการfor
-loop ที่เร็วขึ้น
// Concise ES6/ES2015 syntax
const searchString =
(string, pattern) =>
string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
// Or if you will, with ES5 syntax
function searchString(string, pattern) {
return string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
เวอร์ชั่นนักแสดง (รหัสเพิ่มเติม, น้ำตาลน้อยกว่าวากยสัมพันธ์)
// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
let result = [];
const matches = string.match(new RegExp(pattern.source, pattern.flags));
for (let i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
};
// Same thing, but with ES5 syntax
function searchString(string, pattern) {
var result = [];
var matches = string.match(new RegExp(pattern.source, pattern.flags));
for (var i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
ฉันยังไม่ได้เปรียบเทียบทางเลือกเหล่านี้กับที่กล่าวถึงก่อนหน้านี้ในคำตอบอื่น ๆ แต่ฉันสงสัยว่าวิธีการนี้มีประสิทธิภาพน้อยกว่าและไม่ปลอดภัยน้อยกว่าวิธีอื่น