aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

String.replace và replaceAll: thay một lần hay mọi lần, có giữ nguyên ký tự $ không?

Suong Nguyen by Suong Nguyen
07/11/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một công cụ sửa text cần thay mọi dấu chấm bằng dấu gạch. replace với pattern dạng string chỉ thay lần đầu. Đổi sang RegExp có thể lại khiến dấu chấm mang nghĩa ký tự bất kỳ. Ngoài phía tìm kiếm, nội dung thay thế chứa dấu dollar cũng có quy tắc cần được kiểm tra.

Bài đối chiếu MDN ngày 07/11/2026 và chạy ví dụ trên Node.js 24.18.1. Các test chỉ xử lý chuỗi cục bộ; không có benchmark, công cụ regex bên ngoài hay phép đo trên browser cũ. Cả hai method đều trả chuỗi kết quả mới.

So sánh bằng cùng một nhóm tiêu chí

Tiêu chí replace replaceAll
Pattern là string Thay lần khớp đầu Thay mọi lần khớp
Pattern là RegExp Theo cờ của regex Regex phải có cờ g
Chuỗi replacement có $& Có thể chèn phần khớp Cũng có quy tắc replacement
Replacer function trả text Dùng text được trả về Dùng text được trả về ở mỗi lần khớp
Sửa chuỗi đầu vào Không tự sửa Không tự sửa

Hai method thuộc JavaScript chuẩn và có sẵn trong Node được thử. Nếu hỗ trợ một runtime khác, kiểm tra compatibility trước khi dùng replaceAll; bài không chứng minh mọi môi trường người đọc đều có cùng khả năng hỗ trợ.

1. Kiểm tra pattern string trước

Chạy ví dụ độc lập sau bằng Node. Dấu chấm được truyền như dữ liệu tìm kiếm thông thường:

const assert = require('node:assert/strict');
const original = 'a.b.c';
assert.equal(original.replace('.', '-'), 'a-b.c');
assert.equal(original.replaceAll('.', '-'), 'a-b-c');
assert.equal(original, 'a.b.c');

assert.equal(original.replace(/./g, '-'), '-----');
assert.equal(original.replace(/\./g, '-'), 'a-b-c');
assert.throws(() => original.replaceAll(/\./, '-'), TypeError);
assert.equal(original.replaceAll(/\./g, '-'), 'a-b-c');
console.log('string and RegExp patterns verified');

Ở RegExp, dấu chấm không escape có ý nghĩa khác dấu chấm literal. Khi nhu cầu chỉ là tìm một chuỗi nguyên văn do người dùng nhập, pattern string giúp tránh việc vô tình diễn giải nó thành cú pháp regex.

Tuy nhiên, pattern literal không khiến mọi đối số của phép thay trở thành text nguyên văn. Đối số replacement dạng string vẫn có các mẫu đặc biệt như $&. Cần kiểm tra cả hai phía của thao tác.

2. Giữ replacement đúng nguyên văn

Ví dụ độc lập tiếp theo dùng replacer function khi muốn chèn đúng các ký tự mà người gọi truyền vào:

const assert = require('node:assert/strict');

function replaceLiteral(text, needle, replacement) {
  if (needle === '') throw new RangeError('Needle must not be empty');
  return text.replaceAll(needle, () => replacement);
}

assert.equal('a.a'.replaceAll('.', '$&'), 'a.a');
assert.equal(replaceLiteral('a.a', '.', '$&'), 'a$&a');
assert.equal(replaceLiteral('x-x', 'x', '$$'), '$$-$$');
assert.equal(replaceLiteral('a.b.c', '.', '-'), 'a-b-c');
assert.equal(replaceLiteral('abc', 'missing', '-'), 'abc');
assert.throws(() => replaceLiteral('abc', '', '-'), RangeError);
console.log('literal replacement text verified');

Khi function trả chuỗi $&, nó được dùng như text kết quả thay thế, không tiếp tục áp dụng mẫu $& để chèn phần vừa khớp. Helper có hợp đồng nhận ba string; nó không phải validator cho đối tượng tùy ý truyền vào.

Needle rỗng bị từ chối theo chính sách của helper. Đây là lựa chọn của ví dụ để tránh một phép thay bất ngờ ở nhiều vị trí, không phải khẳng định replaceAll chuẩn không chấp nhận string rỗng.

Kiểm tra trên dữ liệu của công cụ sửa text

Giữ các ca không có phần khớp, một phần khớp, nhiều phần khớp và replacement chứa dollar. Nếu cho phép regex do người dùng nhập, đó là một chế độ riêng cần giao diện và quy tắc rõ ràng; đừng tự chuyển mọi pattern string thành new RegExp mà không nói với người dùng.

Phép thay chuỗi này cũng không giải quyết normalization Unicode hay so khớp không phân biệt hoa thường. Nếu cần những quy tắc đó, thêm bước xử lý và test riêng theo ngôn ngữ dữ liệu. Bài chỉ kiểm chứng khớp chuỗi theo các đầu vào đã nêu.

Tiêu chí chọn trong project

Chọn replace khi muốn thay lần đầu hoặc chủ động dùng RegExp theo cờ của nó. Chọn replaceAll khi muốn thay mọi phần khớp của một string literal. Chọn function replacement nếu text thay thế phải được giữ nguyên, nhất là khi nó có thể chứa dollar.

Không kết luận method nào nhanh hơn từ các assertions này. Trước khi đo tốc độ trên tài liệu dài, xác nhận cùng pattern, cùng replacement và cùng kết quả đầu ra. Sự khác nhau về ngữ nghĩa cần được giải quyết trước việc tối ưu một vòng lặp thay text.

Nguồn tham khảo

  • MDN: String.replace và replacement patterns
  • MDN: String.replaceAll và cờ global

Tags: JavaScriptStringXử lý dữ liệu
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.map và flatMap: giữ nhóm hay ghép thành một danh sách?

by Suong Nguyen
06/11/2026
0

So sánh map và flatMap bằng dữ liệu nhóm để thấy độ sâu làm phẳng, số phần tử đầu ra và giới hạn khi callback async.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Promise.any và Promise.race: chờ thành công đầu tiên hay kết quả đầu tiên?

by Suong Nguyen
05/11/2026
0

So sánh any và race bằng promise điều khiển được, gồm lỗi đầu tiên, AggregateError và danh sách rỗng.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.slice và splice: end index khác deleteCount thế nào?

by Suong Nguyen
04/11/2026
0

So sánh slice và splice bằng cùng một mảng để phân biệt khoảng lấy ra, số phần tử xóa, giá trị trả về và việc thay đổi mảng...

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.some và every: chọn đúng câu hỏi, nhớ trường hợp mảng rỗng

by Suong Nguyen
03/11/2026
0

Kiểm chứng some và every bằng cùng bộ dữ liệu để phân biệt có ít nhất một, tất cả và điều kiện bắt buộc danh sách không rỗng.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native FlatList hai cột: numColumns không tạo layout masonry
  • JavaScript Set với object: cùng id vẫn có thể là hai phần tử
  • Android elapsedRealtime và uptimeMillis: thời gian máy ngủ có được tính không?

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply