Với chuỗi ký tự này là đủ dễ dàng.
Không hẳn vậy! Ví dụ chỉ thay thế sự xuất hiện đầu tiên của string_to_replace
. Thông thường hơn, bạn muốn thay thế tất cả các lần xuất hiện, trong trường hợp đó, bạn phải chuyển đổi chuỗi thành /.../g
RegExp toàn cầu ( ). Bạn có thể làm điều này từ một chuỗi bằng cách sử dụng hàm new RegExp
tạo:
new RegExp(string_to_replace, 'g')
Vấn đề với điều này là bất kỳ ký tự đặc biệt regex nào trong chuỗi ký tự sẽ hành xử theo cách đặc biệt của chúng thay vì là các ký tự bình thường. Bạn sẽ phải gạch chéo lại - thoát chúng để khắc phục điều đó. Thật không may, không có chức năng tích hợp sẵn để làm điều này cho bạn, vì vậy đây là một chức năng bạn có thể sử dụng:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Cũng lưu ý rằng khi bạn sử dụng RegExp replace()
, chuỗi thay thế cũng có một ký tự đặc biệt $
. Điều này cũng phải được thoát nếu bạn muốn có một chữ $
trong văn bản thay thế của bạn!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Bốn $
giây vì đó là một chuỗi thay thế, argh!)
Bây giờ bạn có thể thực hiện thay thế chuỗi toàn cầu bằng 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);
}
Thật là một nỗi đau. May mắn thay, nếu tất cả những gì bạn muốn làm là một chuỗi thẳng thay thế mà không có phần bổ sung nào của regex, có một cách nhanh hơn:
s.split(string_to_replace).join(replacement)
...và đó là tất cả. Đây là một thành ngữ thường được hiểu.
nói rằng tôi muốn thay thế mọi thứ trừ chuỗi_to numplace
Điều đó có nghĩa là gì, bạn muốn thay thế tất cả các đoạn văn bản không tham gia vào một trận đấu với chuỗi? Một sự thay thế bằng ^
chắc chắn không phải điều này, bởi vì ^
có nghĩa là mã thông báo bắt đầu, không phải là phủ định. ^
chỉ là một phủ định trong []
các nhóm nhân vật. Cũng có những cái nhìn tiêu cực (?!...)
, nhưng có những vấn đề với điều đó trong JScript vì vậy bạn thường nên tránh nó.
Bạn có thể thử khớp 'mọi thứ cho đến' chuỗi và sử dụng hàm để loại bỏ bất kỳ khoảng trống nào giữa các chuỗi khớp:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Ở đây, một lần nữa, việc phân chia có thể đơn giản hơn:
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);
/
dấu phân cách regex khi sử dụng biểu mẫu này.