Tìm và Thay Thế
Làm sạch dữ liệu, lọc log, tái cấu trúc mã và định dạng lại ngày tháng với tìm thay thế regex. Backreference nhóm bắt ($1, $2) và thay thế hàng loạt nhiều quy tắc.
Về Công Cụ Tìm và Thay Thế
Công cụ Tìm và Thay Thế là một tiện ích tìm kiếm và thay thế văn bản mạnh mẽ với các tính năng nâng cao bao gồm hỗ trợ biểu thức chính quy, tìm kiếm phân biệt và không phân biệt chữ hoa/thường, khớp toàn bộ từ, tùy chọn bảo toàn chữ hoa cho thay thế thông minh, và cả chế độ thay thế hàng loạt (thay thế tất cả) và từng bước (thay thế tiếp theo). Công cụ làm nổi bật các khớp trong đầu ra để dễ dàng xác minh và cung cấp thống kê thời gian thực bao gồm số lượng khớp, thay thế đã thực hiện và vị trí hiện tại. Hoàn hảo cho chỉnh sửa văn bản, làm sạch dữ liệu, tái cấu trúc mã, di chuyển nội dung và các tác vụ xử lý văn bản hàng loạt.
Làm sao dùng regex trong tìm-và-thay-thế và những mẫu nào hữu ích nhất?
Bật tùy chọn "Dùng biểu thức chính quy" và tìm kiếm của bạn trở thành mẫu, không phải chuỗi nguyên văn. Mẫu thiết yếu: \d+ khớp bất kỳ dãy chữ số, \s+ khớp khoảng trắng, \w+ khớp ký tự từ, .+ khớp bất kỳ thứ gì (tham lam), [A-Za-z]+ chỉ chữ cái (lưu ý không bao gồm chữ Việt có dấu — dùng \p{L}+ với cờ u), ^foo khớp "foo" đầu dòng, foo$ cuối dòng. Nhóm bắt với dấu ngoặc cho phép tái sử dụng kết quả khớp: (\w+)@(\w+) bắt tên người dùng và domain, $1 / $2 trong trường thay thế tham chiếu chúng. Backreference cho phép hoán đổi: (\w+) (\w+) thay bằng $2 $1 hoán đổi các từ liền kề. Luôn thử trên mẫu nhỏ trước — lỗi regex im lặng và có thể phá hỏng cả tài liệu. Dùng tính năng highlight để xác minh trước khi nhấn Thay Tất Cả.
Sự khác biệt giữa lượng từ tham lam, lười biếng và sở hữu trong regex là gì?
Lượng từ tham lam (*, +, ?, {n,m}) khớp càng nhiều càng tốt, sau đó lùi lại đến khi phần còn lại của mẫu vừa. Vậy <.+> trên "<a><b>" khớp toàn bộ "<a><b>" vì .+ tham lam tiêu thụ mọi thứ giữa < đầu tiên và > cuối cùng. Lượng từ lười biếng (*?, +?, ??, {n,m}?) khớp càng ít càng tốt: <.+?> trên cùng đầu vào chỉ khớp "<a>." Lười biếng là thứ bạn thường muốn khi trích thẻ hoặc nội dung giữa các phân cách. Lượng từ sở hữu (*+, ++) khớp tham lam và từ chối lùi — chúng thất bại thay vì thử lại, ngăn việc lùi catastrophic trên đầu vào độc hại. Regex JavaScript không hỗ trợ lượng từ sở hữu nguyên bản; dùng nhóm nguyên tử (?>...) nơi có sẵn.
"Giữ nguyên kiểu chữ" quyết định dùng kiểu chữ nào cho thay thế như thế nào?
Giữ nguyên kiểu chữ là heuristic kiểm tra kết quả khớp gốc và áp dụng cùng mẫu kiểu chữ cho thay thế. Quy tắc trong công cụ này: nếu văn bản khớp toàn chữ thường ("xin chào"), giữ thay thế như bạn gõ ("hi"). Nếu toàn chữ hoa ("XIN CHÀO"), chuyển thay thế thành chữ hoa ("HI"). Nếu chỉ chữ đầu viết hoa ("Xin chào"), viết hoa thay thế ("Hi"). Kiểu chữ hỗn hợp ("xIn ChàO") thường rơi về dạng đã gõ. Hữu ích để đổi tên biến trong tài liệu, hoán đổi tên sản phẩm xuất hiện trong tiêu đề và thân bài, hoặc thay thế thuật ngữ trong khi bảo toàn viết hoa đầu câu. Chỉ áp dụng cho tìm kiếm văn bản thuần, không phải regex — với regex, dùng nhóm bắt nhận biết kiểu chữ và mẫu thay thế có điều kiện trong ngôn ngữ scripting của bạn.
"Khớp toàn bộ từ" thực sự làm gì và khi nào nên dùng?
Khớp toàn bộ từ bọc mẫu tìm kiếm của bạn với mỏ neo ranh giới từ (\b ở cả hai bên). Ranh giới từ là vị trí rộng-không giữa ký tự từ (chữ, số, gạch dưới) và không-ký-tự-từ (khoảng trắng, dấu câu, hết chuỗi). Vậy tìm "mèo" với toàn-từ bật khớp "mèo" trong "Con mèo chạy" nhưng bỏ qua "mèo con" (vì mèo là toàn từ riêng), "mèo mun." Dùng khi thay tên biến trong mã ("i" không nên khớp "if"), tên sản phẩm trong copy ("Pro" không nên khớp "Processor"), hoặc các từ chung ngắn. Cảnh báo: trong tiếng Việt, các âm tiết ghép như "học sinh" bị \b coi là hai từ riêng — vì có khoảng trắng giữa chúng — nên việc thay "học" sẽ ảnh hưởng "học sinh." Với chữ Hán Nôm và các ngôn ngữ không khoảng trắng, \b có thể không hoạt động như mong đợi.
Làm sao thực hiện tìm-và-thay-thế hàng loạt qua nhiều dòng hoặc phần của tài liệu?
Dùng Thay Tất Cả cho trường hợp đơn giản — một tìm kiếm, một thay thế, áp dụng mọi nơi. Cho biến đổi tuần tự (tìm A thay bằng B, rồi tìm C thay bằng D, rồi tìm E thay bằng F), làm từng cái một và xác minh mỗi bước. Cẩn thận lỗi thứ tự thao tác: nếu thay "mèo" bằng "chó" rồi "chó" bằng "chuột," những con mèo gốc sẽ thành chuột, có lẽ không phải ý bạn. Với việc viết lại đa bước phức tạp, dán kết quả của mỗi bước vào trường mới thay vì xâu chuỗi tại chỗ. Với việc thực sự hàng loạt qua nhiều tệp, công cụ trình duyệt này tốt cho từng tài liệu; cho hàng trăm tệp, dùng sed (Unix), PowerShell hoặc tìm-thay-thế đa tệp của VS Code.

Làm sao dùng regex với nhóm bắt để định dạng lại dữ liệu như ngày, số điện thoại, hoặc tên?
Nhóm bắt đặt dấu ngoặc quanh các phần của khớp để tái sử dụng trong thay thế. Để chuyển ngày Mỹ MM/DD/YYYY sang ISO YYYY-MM-DD: tìm (\d{2})/(\d{2})/(\d{4}) và thay bằng $3-$1-$2. Để chuyển định dạng Việt DD/MM/YYYY sang ISO: tìm (\d{2})/(\d{2})/(\d{4}) thay bằng $3-$2-$1. Để hoán đổi "Họ Tên" thành "Tên Họ": tìm (\S+) (\S+) thay bằng $2 $1 (cẩn thận với tên ba từ). Để chuẩn hóa số điện thoại Việt Nam thành 0XX-XXX-XXXX: tìm (\d{2,3})\D*(\d{3})\D*(\d{3,4}) thay bằng 0$1-$2-$3. Nhóm có tên (?<năm>\d{4})-(?<tháng>\d{2})-(?<ngày>\d{2}) rõ ràng hơn cho mẫu phức tạp. Luôn thử trên vài mẫu trước khi chạy trên toàn tài liệu.
Những cạm bẫy regex phổ biến nào phá hỏng văn bản và làm sao tránh?
Năm cái cổ điển: (1) Quên thoát ký tự đặc biệt regex — tìm "." khớp bất kỳ ký tự; bạn cần \. cho dấu chấm nguyên văn. (2) Khớp tham lam qua xuống dòng — .* trên "<a>foo</a><b>bar</b>" không có bổ ngữ lười biếng khớp toàn chuỗi. (3) Lùi catastrophic — mẫu như (a+)+ trên "aaaab" có thể tốn thời gian theo cấp số nhân; dùng nhóm nguyên tử hoặc lượng từ sở hữu. (4) Nhầm lẫn mỏ neo — ^ khớp đầu chuỗi mặc định, đầu dòng chỉ với chế độ đa dòng. (5) Thay thế trong thay thế — nếu hoán đổi "cũ" → "mới cũ" công cụ chỉ thay một lần mỗi vị trí khớp, nhưng thay thế đệ quy không giới hạn trong một số engine có thể treo. Luôn: thử trên văn bản mẫu, dùng tính năng highlight để xem trước, giữ bản sao lưu văn bản gốc, thay thế từng bước khi biến đổi xâu chuỗi.
Tìm-và-thay-thế hoạt động ra sao cho tái cấu trúc mã so với văn bản ngôn ngữ tự nhiên?
Tái cấu trúc mã cần ý thức cú pháp mà regex thuần không thể cung cấp. "Thay 'foo' bằng 'bar'" trong mã có thể nhầm chạm chuỗi, comment và định danh tình cờ chứa "foo." Với mã, ưu tiên công cụ nhận biết ngôn ngữ: đổi tên symbol của VS Code (F2), refactor IntelliJ, jscodeshift cho JavaScript, libcst cho Python. Chúng phân tích AST và đổi tên chỉ định danh thực, để chuỗi và comment nguyên vẹn. Tìm-thay ngôn ngữ tự nhiên dễ tha thứ hơn nhưng có cạm bẫy riêng: thay thế không phân biệt kiểu chữ có thể phá danh từ riêng ("Việt Nam" thành "việt nam"), số nhiều có thể để lại hậu tố mồ côi, và ranh giới từ có thể trật qua gạch ngang. Dùng công cụ này cho prose, dự thảo và biến đổi một lần; tìm đến công cụ tái cấu trúc dựa AST cho thay đổi mã production.
Thay thế hàng loạt nhiều quy tắc hoạt động như thế nào?
Bật "Thay thế hàng loạt nhiều quy tắc" để áp dụng cả một bộ quy tắc trong một lần chạy có thể kiểm soát, thay vì chạy từng thay thế một. Một ô văn bản xuất hiện để bạn nhập mỗi dòng một quy tắc dạng tìm => thay (cũng có thể tách hai vế bằng phím Tab). Ví dụ: colour => color, rồi U.S.A. => USA, rồi => (gộp khoảng trắng đôi). Các quy tắc chạy từ trên xuống theo thứ tự, nên thứ tự rất quan trọng — đặt các chuẩn hóa sớm trước những quy tắc phụ thuộc vào chúng, và tránh vòng lặp như mèo => chó rồi chó => chuột trừ khi bạn muốn mèo thành chuột. Mọi tùy chọn ở trên (regex, phân biệt chữ hoa, toàn bộ từ, đa dòng, bảo toàn chữ hoa) áp dụng cho tất cả quy tắc, nên quy tắc regex cũng dùng được nhóm bắt. Dòng trống và dòng bắt đầu bằng # bị bỏ qua, để bạn ghi chú và nhóm các quy tắc. Sau khi Thay Tất Cả, thông báo cho biết bao nhiêu quy tắc khớp và tổng số lần thay. Đây là cách nhanh nhất để chuẩn hóa thuật ngữ, di chuyển nội dung và làm sạch CSV/log mà trước đây phải xâu chuỗi nhiều lần chạy thủ công.
Vì sao backreference $1 và $2 giờ chèn đúng văn bản đã bắt?
Backreference nhóm bắt hoạt động trong trường thay thế cho cả Thay Tất Cả và Thay Thế Tiếp Theo. Bọc các phần của mẫu trong dấu ngoặc và tham chiếu bằng $1, $2, $3 (hoặc $<tên> cho nhóm có tên) trong trường Thay Bằng. Ví dụ minh họa: để chuyển ngày Mỹ MM/DD/YYYY sang ISO, tìm (\d{2})/(\d{2})/(\d{4}) và thay bằng $3-$1-$2 nên 06/15/2024 thành 2024-06-15. Để hoán đổi "Họ, Tên" thành "Tên Họ", tìm (\w+), (\w+) thay bằng $2 $1. Để định dạng lại ngày có gạch ngang sang gạch chéo, tìm (\d{4})-(\d{2})-(\d{2}) thay bằng $3/$1. Nhóm có tên: tìm (?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2}) thay bằng $<d>/$<m>/$<y>. Lưu ý: các token này chỉ mở rộng khi bật "Sử dụng biểu thức chính quy"; ở chế độ văn bản thuần $1 được coi là ký tự nguyên văn. Dùng xem trước highlight để xác nhận nhóm bắt đúng như mong đợi trước khi nhấn Thay Tất Cả.
Ví Dụ Thao Tác Tìm và Thay Thế
| Tìm | Thay Thế | Tùy Chọn | Kết Quả |
|---|---|---|---|
| mèo | chó | Chữ hoa: OFF | Thay đổi 'mèo', 'Mèo', 'MÈO' thành 'chó' |
| \d+ | SỐ | Dùng regex: ON | Thay thế tất cả số bằng 'SỐ' |
| con | cái | Toàn từ: ON | Thay 'con' nhưng không 'công' hay 'cơn' |
| xin chào | tạm biệt | Bảo toàn chữ hoa: ON | Xin Chào→Tạm Biệt, XIN CHÀO→TẠM BIỆT |
| ^\s+ | Regex + Đa dòng: ON | Loại bỏ khoảng trắng đầu mỗi dòng |
