ด้วยตัวอักษรสตริงนี้ง่ายพอ
ไม่ได้จริงๆ! ตัวอย่างจะแทนที่การเกิดขึ้นครั้งแรกstring_to_replace
เท่านั้น โดยทั่วไปคุณต้องการแทนที่เหตุการณ์ทั้งหมดซึ่งในกรณีนี้คุณต้องแปลงสตริงเป็น global ( /.../g
) RegExp คุณสามารถทำได้จากสตริงโดยใช้ตัวnew RegExp
สร้าง:
new RegExp(string_to_replace, 'g')
ปัญหานี้คือตัวอักษรพิเศษใด ๆ regex ในตัวอักษรสตริงจะทำงานในรูปแบบพิเศษของพวกเขาแทนที่จะเป็นตัวอักษรปกติ คุณจะต้องแบ็กสแลช - หลบหนีเพื่อแก้ไข น่าเสียดายที่ไม่มีฟังก์ชั่นในตัวที่จะทำสิ่งนี้ให้คุณดังนั้นนี่คือฟังก์ชันที่คุณสามารถใช้:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
โปรดทราบว่าเมื่อคุณใช้ RegExp ในreplace()
ตอนนี้สตริงการแทนที่จะมีอักขระพิเศษเช่น$
กัน สิ่งนี้จะต้องถูกหลบหนีหากคุณต้องการให้มีตัวอักษร$
อยู่ในข้อความที่ถูกแทนที่!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(สี่ $
s เพราะนั่นคือตัวเองสตริงแทนที่ - argh!)
ตอนนี้คุณสามารถใช้การแทนที่สตริงส่วนกลางด้วย RegExp:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
ช่างเจ็บปวดเหลือเกิน โชคดีถ้าสิ่งที่คุณต้องการทำคือการแทนที่สตริงแบบตรงโดยไม่มีส่วนเพิ่มเติมของ regex มีวิธีที่เร็วกว่า:
s.split(string_to_replace).join(replacement)
... และนั่นคือทั้งหมด นี่เป็นสำนวนที่เข้าใจกันทั่วไป
บอกว่าฉันต้องการแทนที่ทุกอย่าง แต่ string_to_replace
หมายความว่าคุณต้องการแทนที่ข้อความทั้งหมดที่ไม่ได้มีส่วนร่วมในการแข่งขันกับสตริง? การแทนที่ด้วยสิ่ง^
นี้ไม่ได้เป็นอย่างแน่นอนเพราะ^
หมายถึงโทเค็นเริ่มต้นของสตริงไม่ใช่การปฏิเสธ ^
เป็นเพียงการปฏิเสธใน[]
กลุ่มตัวละคร นอกจากนี้ยังมี lookaheads เชิงลบ(?!...)
แต่มีปัญหาใน JScript ดังนั้นโดยทั่วไปคุณควรหลีกเลี่ยง
คุณอาจลองจับคู่ 'ทุกอย่างจนถึงสตริง' และใช้ฟังก์ชันเพื่อยกเลิกการเว้นว่างระหว่างสตริงที่ตรงกัน:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
ที่นี่อีกครั้งการแบ่งอาจง่ายกว่า:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
/
ตัวคั่น regex เมื่อใช้แบบฟอร์มนี้ด้วย