String.replaceAll không có RegEx


115

Tôi muốn thay thế tất cả các trường hợp của một chuỗi con trong một chuỗi nhưng String.replaceAll()chỉ chấp nhận một mẫu. Chuỗi mà tôi đã đến từ một trận đấu trước đó. Có thể thêm các lối thoát vào mẫu mà tôi có hoặc có một phiên bản của replaceAll()lớp khác chấp nhận một chuỗi ký tự thay vì một mẫu không?


có thể trùng lặp sự cố Backslash với String.replaceAll
McDowell

Câu trả lời:


189

Chỉ sử dụng String.replace(CharSequence,CharSequence)hơn là replaceAll.


13
Điều này không chỉ thay thế đầu tiên? Kỳ lạ là họ gọi nó là "ReplaceAll" thay vì "ReplaceRegex".
Magic Octopus Urn,

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));lợi nhuận "hi world, hi life, hi you".
Thiago Mata,

14
@MagicOctopusUrn: Vâng, tôi đồng ý rằng đó là cách đặt tên rất tệ - nó gây ra rất nhiều nhầm lẫn theo thời gian.
Jon Skeet

đặt tên rất tệ cho các phương thức. Tại sao họ (sun / oracle) lại biến những thứ đơn giản trở nên phức tạp
Stunner

93

Phương pháp để thêm lối thoát là Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

Nhưng như Jon nói bạn chỉ có thể sử dụng replace(). Mặc dù thực tế là nó lệch khỏi replaceAlltên, nó thay thế tất cả các lần xuất hiện giống như replaceAll().


Hoạt động hoàn hảo nếu bạn có "$" trong matchStr chẳng hạn.
Julien Lafont

thay vì Pattern.compile (); Pattern.quote () mang lại kết quả không mong muốn
Pavlo Zvarych

@PavloZvarych: Pattern.compile()biên dịch chuỗi như là một biểu hiện thường xuyên, có nghĩa là ký tự đặc biệt sẽ được cung cấp ý nghĩa đặc biệt. Điều đó hoàn toàn trái ngược với những gì Pattern.quote()làm và những gì OP đang yêu cầu ( quote()nói, "coi chuỗi như một chữ"). Có lẽ bạn có thể mở rộng về "kết quả không mong muốn" mà bạn đang nói đến.
Mark Peters

@MarkPeters nó giống như \\ G1 \\ G cho "$ 1"
Pavlo Zvarych

1
@PavloZvarych: Nếu bạn đang cố gắng báo giá thay thế (chứ không phải mẫu tìm kiếm), bạn muốn sử dụng Matcher.quoteReplacement("$aa +"). Pattern.compile()tạo ra a Pattern, không phải a String, vì vậy tôi không rõ bạn đang sử dụng nó như thế nào replaceAll.
Mark Peters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.