Đó là vì ký hiệu đô la là ký tự đặc biệt trong chuỗi thay thế, sử dụng Matcher.quoteReplacement()
để thoát khỏi loại ký tự này.
subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject));
Từ doc của String.replaceAll()
:
Lưu ý rằng những dấu xồ nguợc (\
) và các dấu hiệu đô la ($
) trong chuỗi thay thế có thể gây ra kết quả là khác nhau hơn nếu nó được là điều trị như một chuỗi thay thế chữ; xem Matcher.replaceAll. Sử dụng Matcher.quoteReplacement(java.lang.String)
để chặn đặc biệt ý nghĩa của các ký tự này, nếu muốn.
Lưu ý rằng ký hiệu đô la được sử dụng để chỉ các nhóm chụp tương ứng trong cụm từ thông dụng ($0
, $1
, v.v.).
EDIT
Matcher.quoteReplacement()
đã được giới thiệu trong Java 1.5, nếu bạn đang mắc kẹt trong Java 1,4 bạn phải thoát $
bằng tay bằng cách thay thế nó với \$
bên trong chuỗi.Nhưng kể từ khi String.replaceAll()
cũng sẽ mất \
và $
làm ký tự đặc biệt, bạn phải thoát khỏi chúng một lần và bạn cũng phải thoát khỏi tất cả \
một lần nữa cho thời gian chạy Java.
("$", "\$") /* what we want */
("\$", "\\\$") /* RegExp engine escape */
("\\$", "\\\\\\$") /* Java runtime escape */
Vì vậy, chúng tôi nhận được:
calSubject = calSubject.replaceAll("\\$", "\\\\\\$");
Khi bạn nói nó bị treo, điều gì làm bạn nghĩa là gì? Bạn có một dấu vết ngăn xếp hay không đơn giản là không thay thế bất cứ điều gì? –
Bạn có đang nhận được IllegalArgumentException không? – Jops
lỗi là: java.lang.IndexOutOfBoundsException: Không có nhóm 3 – OakvilleWork