2015-05-26 60 views
5

Tôi muốn thay thế tất cả các lần xuất hiện của một nhóm trong một chuỗi.Thay thế tất cả các lần xuất hiện của nhóm

String test = "###,##.##0.0########"; 
System.out.println(test); 
test = test.replaceAll("\\.0(#)", "0"); 
System.out.println(test); 

Kết quả tôi đang cố gắng để có được là ###,##.##0.000000000 Về cơ bản, tôi muốn thay thế tất cả # biểu tượng được trailing các .0. Tôi đã tìm thấy this about dynamic replacement nhưng tôi không thể thực sự làm cho nó hoạt động.

Giải pháp tối ưu sẽ không tính đến số lượng băm sẽ được thay thế (nếu có bất kỳ sự nhầm lẫn nào).

+1

Vì vậy, bạn muốn thay thế tất cả các '# 'sau' .0' để' 0'? – npinti

+0

@npinti. Có, xin lỗi về sự nhầm lẫn, tôi đã thêm lời giải thích. – alkis

+0

Có bao nhiêu ký tự băm thay thế bằng '0' có thể có trong chuỗi đầu vào? Không giới hạn, hoặc nói, một trăm? –

Trả lời

5

Bạn có thể sử dụng một regex đơn giản để đạt được nhiệm vụ của mình.

#(?=#*+$) 

(?=#*+$) = A dương tính look-ahead để kiểm tra đối với bất kỳ # được trước bởi 0 hoặc nhiều # ký trước khi kết thúc chuỗi $. Chỉnh sửa: Tôi hiện đang sử dụng possessive quantifier*+ để tránh mọi vấn đề về hiệu suất.

Xem demo

IDEONE:

String test = "###,##.##0.0###########################################"; 
test = test.replaceAll("#(?=#*+$)", "0"); 
System.out.println(test); 
+0

Giải pháp tuyệt vời và cảm ơn bạn đã giải thích. Tất nhiên upvoted – alkis

+1

Vui mừng được giúp đỡ. Tôi cũng nghĩ rằng bạn thậm chí có thể tối ưu hóa hơn nữa điều này bằng cách sử dụng định lượng sở hữu: '# (? = # * + $)'. Tôi đã chỉnh sửa câu trả lời. –

+0

Hiệu suất không phải là một vấn đề ở đây vì chúng ta đang nói về các chuỗi nhỏ, nhưng vẫn còn, thật tuyệt vời khi biết sự khác biệt. Có thể giải thích từng bước hoạt động regex không? Mặc dù các câu trả lời giải quyết vấn đề của tôi, nó sẽ là tuyệt vời nếu tài liệu tồn tại (dạy ai đó để cá ...) – alkis

7
#(?!.*\\.0) 

Bạn có thể thử this.Replace bởi 0 .See demo.

https://regex101.com/r/yW3oJ9/12

+0

Nếu tôi hiểu chính xác, nó sẽ như sau: Thay thế mọi '#' nhưng loại bỏ tất cả các giá trị trước '.0'. Bạn có thể giải thích '?!'? – alkis

+0

@alkis '?!' Là lookahead tiêu cực. Nó sẽ thay thế mọi '#' mà không có '.0' trước nó. – vks

2

Bạn có thể chia văn bản của bạn về "0.0" và thay thế chỉ dành riêng cho phần thứ hai:

String[] splited = "###,##.##0.0########".split("0.0"); 
String finalString = splited[0] + "0.0" + splited[1].replaceAll("#","0"); 
+0

Tôi thích giải pháp regex hơn. Xin lỗi nếu tôi không đủ rõ ràng. Điều này là hợp lệ mặc dù, do đó, upvoted. – alkis

Các vấn đề liên quan