2015-10-23 15 views
9

Ví dụ:Hủy bỏ tất cả các dấu chấm câu từ ngày kết thúc của một chuỗi

// A B C.  -> A B C 
// !A B C!  -> !A B C 
// A? B?? C??? -> A? B?? C 

Dưới đây là những gì tôi có cho đến nay:

while (endsWithRegex(word, "\\p{P}")) { 
    word = word.substring(0, word.length() - 1); 
} 

public static boolean endsWithRegex(String word, String regex) { 
    return word != null && !word.isEmpty() && 
     word.substring(word.length() - 1).replaceAll(regex, "").isEmpty(); 
} 

giải pháp hiện tại này hoạt động, nhưng vì nó đã gọi String.replaceAll trong vòng endsWithRegex, chúng tôi s hould có thể làm điều gì đó như thế này:

word = word.replaceAll(/* regex */, ""); 

Bất kỳ lời khuyên nào?

+2

Thử 'word = word.replaceAll (" \\ s * \\ p {Punct} + \\ s * $ "," ");'. Nó sẽ loại bỏ tất cả các dấu câu và sẽ cắt chuỗi từ bên phải. –

Trả lời

3

tôi đề nghị sử dụng

\s*\p{Punct}+\s*$ 

Nó sẽ phù hợp với khoảng trắng không bắt buộc và dấu chấm câu ở phần cuối của chuỗi .

Nếu bạn không quan tâm đến khoảng trắng, chỉ cần sử dụng \p{Punct}+$.

Đừng quên rằng trong chuỗi Java, dấu gạch chéo ngược phải được tăng gấp đôi để biểu thị dấu gạch chéo ngược chữ (phải được sử dụng làm biểu tượng thoát regex).

Java demo

String word = "!Words word! "; 
word = word.replaceAll("\\s*\\p{Punct}+\\s*$", ""); 
System.out.println(word); // => !Words word 
+0

Wiktor, điều này dường như không hoạt động như sau: \t \t Từ chuỗi = "! Từ ngữ? -"; Xem: http://ideone.com/DKSKAP –

+1

@SaqibAli: Bạn có thể sử dụng ['" (\\ p {P} + \\ s *) + $ "'] (https://regex101.com/r/zG5lK1/2) để xóa dấu chấm câu liên tiếp bằng khoảng trắng. Hoặc nếu bạn không quan tâm đến dấu chấm câu nhiều, hãy sử dụng ['" [\\ p {P} \\ s] + $ "'] (https://regex101.com/r/zG5lK1/3) sẽ cắt tất cả chuỗi trên theright từ không gian hoặc dấu chấm câu hoặc cả hai. –

+0

Wiktor, làm cách nào để tôi không xóa dấu ngoặc đơn? –

1

Bạn có thể sử dụng:

str = str.replaceFirst("\\p{P}+$", ""); 

Để bao gồm không gian thêm:

str = str.replaceFirst("[\\p{Space}\\p{P}]+$", "") 
0

thế nào về điều này, nếu bạn có thể mất một hit nhỏ trong hiệu quả.

  1. đảo ngược chuỗi đầu vào

  2. giữ xoá các ký tự cho đến khi bạn nhấn một bảng chữ cái

  3. đảo ngược chuỗi và trả về

0

tôi đã sửa đổi logic của phương pháp của bạn

public static boolean endsWithRegex(String word, String regex) { 

     return word != null && !word.isEmpty() && word.matches(regex); 
} 

và regex của bạn là: regex = ".*[^a-zA-Z]$";

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