2010-11-04 83 views
7

Tôi đang cố gắng thay thế dấu chấm cuối cùng trong một Chuỗi bằng cách sử dụng cụm từ thông dụng.Làm thế nào để thay thế dấu chấm cuối cùng trong chuỗi bằng cách sử dụng cụm từ thông dụng?

Hãy nói rằng tôi có chuỗi sau:

String string = "hello.world.how.are.you!"; 

Tôi muốn thay thế dấu chấm cuối cùng với dấu chấm than như vậy mà kết quả là:

"hello.world.how.are!you!" 

Tôi đã cố gắng diễn đạt khác nhau bằng cách sử dụng phương pháp String.replaceAll(String, String) mà không có bất kỳ may mắn nào.

Trả lời

12

Một cách sẽ là:

string = string.replaceAll("^(.*)\\.(.*)$","$1!$2"); 

Hoặc bạn có thể sử dụng lookahead tiêu cực như:

string = string.replaceAll("\\.(?!.*\\.)","!"); 

Regex in Action

+0

Cảm ơn rất nhiều! Tôi sẽ không bao giờ nghĩ ra con quái vật đó. – digiarnie

+2

Thực tế là nó là một con quái vật (lời nói của bạn, không phải của tôi) có lẽ là một đối số tốt cho _not_ bằng cách sử dụng nó :-) Tuy nhiên, nếu nó hoạt động, nó sẽ được chấp nhận vì bạn đã yêu cầu một giải pháp regex. – paxdiablo

+0

Tôi đồng ý với điều đó. – digiarnie

8

Mặc dù bạn có thể sử dụng một regex, đôi khi tốt nhất để bước trở lại và chỉ cần làm theo cách cũ. Tôi đã luôn luôn tin rằng, nếu bạn không thể nghĩ về một regex để làm điều đó trong khoảng hai phút, nó có lẽ không phù hợp với một giải pháp regex.

Không nghi ngờ gì có được một số câu trả lời tuyệt vời về regex tại đây. Một số trong số họ thậm chí có thể đọc được :-)

Bạn có thể sử dụng lastIndexOf để có được sự xuất hiện cuối cùng và substring để xây dựng một chuỗi mới: chương trình hoàn chỉnh này cho thấy cách:

public class testprog { 
    public static String morph (String s) { 
     int pos = s.lastIndexOf("."); 
     if (pos >= 0) 
      return s.substring(0,pos) + "!" + s.substring(pos+1); 
     return s; 
    } 
    public static void main(String args[]) { 
     System.out.println (morph("hello.world.how.are.you!")); 
     System.out.println (morph("no dots in here")); 
     System.out.println (morph(". first")); 
     System.out.println (morph("last .")); 
    } 
} 

Đầu ra là:

hello.world.how.are!you! 
no dots in here 
! first 
last ! 
+0

Vâng tôi đã có một giải pháp bằng cách sử dụng StringBuilder và thay thế dựa trên chỉ mục của dấu chấm cuối cùng. Nhưng tôi muốn làm cho nó được thực hiện bằng cách sử dụng một biểu thức chính quy nếu có thể do đó câu hỏi. – digiarnie

+0

Giống như một FYI, giải pháp trước đây của tôi bằng cách sử dụng StringBuilder trông như thế này: StringBuilder builder = new StringBuilder (string); builder.replace (lastDotIndex, lastDotIndex + 1, "!"); String newString = builder.toString(); – digiarnie

7

Regex bạn cần là \\.(?=[^.]*$). các ?= là một lookahead khẳng định

"hello.world.how.are.you!".replace("\\.(?=[^.]*$)", "!") 
1

Hãy thử điều này:

string = string.replaceAll("[.]$", ""); 
Các vấn đề liên quan