2013-04-15 32 views
8

Tôi đang gặp một vấn đề với việc thay thế một chuỗi trong java ...

dòng là:

subject = subject.replaceAll("\\[calEvent\\]", calSubject); 

Dòng này không làm việc với $ đăng nhập calSubject.

biến chủ đề là biến chủ đề động từ tệp. ví dụ như vậy: Calnot = [calEvent]

điều tôi đang cố gắng thay thế bộ giữ chỗ calEvent bằng biến chủ đề. nhưng làm thế nào tôi đã làm nó không hoạt động vì nó bị treo khi đối tượng chứa một dấu $.

bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này để nó không bị ngắt nếu chủ đề chứa ký hiệu $ hoặc bất kỳ ký tự nào cho vấn đề đó?

+0

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ì? –

+0

Bạn có đang nhận được IllegalArgumentException không? – Jops

+0

lỗi là: java.lang.IndexOutOfBoundsException: Không có nhóm 3 – OakvilleWork

Trả lời

20

Đó 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 \$ 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("\\$", "\\\\\\$"); 
+0

hi cảm ơn rất nhiều vì gợi ý .. chương trình sử dụng java 1.4, và nó dường như không hoạt động. khó nói bởi vì tôi không thể gỡ lỗi cục bộ. chỉ sử dụng nhật ký để giải quyết nó. java 1.4 không hỗ trợ: Matcher.quoteReplacement? – OakvilleWork

+0

Xem chỉnh sửa cuối cùng của tôi. – zakinster

+0

Có đề cập nào trong tài liệu regex java rằng dấu đô la được sử dụng để chỉ các nhóm chụp không? –

5

nếu bạn không cần tính năng regex, bạn có thể xem xét sử dụng phương pháp này của lớp String: replace(CharSequence target,CharSequence replacement)

Nó tiết kiệm "thoát khỏi" những dấu xồ nguợc của bạn là tốt.

api doc:

Thay thế mỗi chuỗi con của chuỗi này phù hợp với đen đích chuỗi với nghĩa đen quy định trình tự thay thế. Số tiền thay thế từ đầu chuỗi đến cuối, ví dụ , thay thế "aa" bằng "b" trong chuỗi "aaa" sẽ dẫn đến "ba" thay vì "ab".

+0

bạn có thể cung cấp ví dụ về điều này không? – OakvilleWork

+1

Quá tải của phương thức 'replace()' đã được thêm vào trong JDK 1.5 và OP bị mắc kẹt với JDK 1.4. Và bạn không thể sử dụng ['replace (char, char)'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28char,%20char% 29) bởi vì giá trị mới không phải là một 'char' duy nhất. –

+0

@AlanMoore khi tôi đăng, OP không đề cập bất kỳ thông tin nào về 1.4. nhưng bạn là đúng, phương pháp này là có từ 1.5. – Kent

2

Từ các tài liệu của replaceAll:

Lưu ý rằng những dấu xồ nguợc() và dấu hiệu đô la ($) trong chuỗi thay thế có thể gây ra kết quả khác với nếu nó là được coi là chuỗi thay thế bằng chữ; xem Matcher.replaceAll. Sử dụng java.util.regex.Matcher.quoteReplacement để chặn đặc biệt ý nghĩa của các ký tự này, nếu muốn.

Và trong Matcher.replaceAll

dấu hiệu Dollar có thể được coi là tài liệu tham khảo để subsequences bắt như mô tả ở trên, và những dấu xồ nguợc được sử dụng để thoát khỏi nhân vật đen trong chuỗi thay thế.

0

Không chắc tôi thực sự hiểu câu hỏi của bạn, nhưng cố gắng

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 
0

Vui lòng sử dụng

Matcher.quoteReplacement(calEvent); 
Các vấn đề liên quan