Các Pattern.quote(String s)
loại làm những gì bạn muốn. Tuy nhiên, nó để lại một chút mong muốn; nó không thực sự thoát khỏi các ký tự riêng lẻ, chỉ quấn chuỗi bằng\Q...\E
.
Không có một phương pháp nào thực hiện chính xác những gì bạn đang tìm kiếm, nhưng tin tốt là nó thực sự khá đơn giản để thoát tất cả các ký tự đặc biệt trong một biểu thức chính quy Java:
regex.replaceAll("[\\W]", "\\\\$0")
Tại sao điều này hoạt động? Vâng, tài liệu cho Pattern
biết cụ thể rằng nó được phép thoát các ký tự không phải chữ cái mà không nhất thiết phải thoát:
Đó là một lỗi khi sử dụng dấu gạch chéo ngược trước bất kỳ ký tự chữ cái nào không biểu thị một cấu trúc thoát; chúng được dành riêng cho các phần mở rộng trong tương lai cho ngôn ngữ biểu thức chính quy. Dấu gạch chéo ngược có thể được sử dụng trước một ký tự không phải bảng chữ cái bất kể ký tự đó có phải là một phần của cấu trúc không thoát.
Ví dụ, ;
không phải là một ký tự đặc biệt trong một biểu thức chính quy. Tuy nhiên, nếu bạn thoát khỏi nó, Pattern
vẫn sẽ diễn giải\;
là ;
. Dưới đây là một số ví dụ khác:
>
trở nên \>
tương đương với>
[
trở thành \[
mà là dạng thoát của[
8
vẫn còn 8
.
\)
trở thành \\\)
mà là các dạng thoát của \
và(
nối.
Lưu ý: Điều quan trọng là định nghĩa của "non-alphabetic", trong tài liệu này thực sự có nghĩa là các ký tự "không phải từ ", hoặc các ký tự nằm ngoài bộ ký tự [a-zA-Z_0-9]
.