2011-09-26 68 views
66

Tôi muốn loại bỏ ký tự đặc biệt như:Làm cách nào để xóa các ký tự đặc biệt khỏi chuỗi?

- +^. : , 

từ một chuỗi sử dụng Java.

+0

Bạn dường như đã biết những gì một regex dựa vào cách bạn đã gắn thẻ câu hỏi của bạn. Bạn đã thử đọc tài liệu cho lớp 'String' chưa? Đặc biệt, tìm từ 'regex'; có một vài phương pháp, và một chút suy nghĩ nên cho bạn biết làm thế nào để tiến hành ... :) –

+2

Cụm từ "ký tự đặc biệt" quá lạm dụng để gần như hoàn toàn vô nghĩa. Nếu ý của bạn là, "Tôi có danh sách ** các ký tự ** cụ thể mà tôi muốn xóa", sau đó làm như Thomas gợi ý và tạo mẫu của bạn với một lớp nhân vật regex và 'replaceAll' chúng đi. Nếu bạn có nhiều yêu cầu bí truyền hơn, hãy chỉnh sửa câu hỏi. :) –

+1

không phải là ký tự đặc biệt ... đây là: äâêíìéè vì chúng không phải là các loại ký tự 1 byte phổ biến của bạn như - +^là ... anyway, như Ray đã nói, hoặc thực hiện một 'replaceAll' cho chúng, hoặc, làm phân tích cú pháp trên chuỗi, thêm các ký tự không phải là ký tự mà bạn muốn đưa ra một chuỗi khác và cuối cùng chỉ cần thực hiện một + = đến một chuỗi bạn sẽ quay trở lại. –

Trả lời

203

Điều đó phụ thuộc vào những gì bạn xác định nhân vật là đặc biệt, nhưng cố gắng replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]",""); 

Lưu ý rằng các nhân vật ^ không phải là người đầu tiên trong danh sách, kể từ khi bạn muốn sau đó hoặc là phải thoát khỏi nó hoặc nó có nghĩa là "bất kỳ nhưng những nhân vật này".

lưu ý khác: nhân vật - cần phải là người đầu tiên hoặc cuối cùng trong danh sách, nếu không bạn sẽ phải thoát khỏi nó hoặc nó sẽ xác định một phạm vi (ví dụ :-, có nghĩa là "tất cả các nhân vật trong phạm vi :-, Vì vậy, để duy trì sự nhất quán và không phụ thuộc vào định vị ký tự, bạn có thể muốn thoát khỏi tất cả các ký tự có ý nghĩa đặc biệt trong biểu thức chính quy (danh sách sau đây không đầy đủ, vì vậy hãy chú ý đến các ký tự khác). như (, {, $ v.v.):

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]",""); 


Nếu bạn muốn để có được thoát khỏi tất cả các dấu chấm câu và các ký hiệu, hãy thử regex này: \p{P}\p{S} (ghi nhớ rằng trong chuỗi Java bạn phải thoát khỏi dấu gạch chéo lên: "\\p{P}\\p{S}").

Một cách thứ ba có thể là một cái gì đó như thế này, nếu bạn biết chính xác có thể xác định những gì nên để trong chuỗi của bạn:

String result = yourString.replaceAll("[^\\w\\s]",""); 

Điều này có nghĩa: thay thế tất cả những gì không phải là một nhân vật từ (az trong mọi trường hợp, 0-9 hoặc _) hoặc khoảng trắng.

Chỉnh sửa: xin lưu ý rằng có một vài mẫu khác có thể hữu ích. Tuy nhiên, tôi không thể giải thích tất cả, vì vậy hãy xem phần tham chiếu của regular-expressions.info.

Dưới đây là lựa chọn ít hạn chế để các "xác định ký tự cho phép" cách tiếp cận, theo đề nghị của Ray:

String result = yourString.replaceAll("[^\\p{L}\\p{Z}]",""); 

Các regex phù hợp với tất cả mọi thứ đó không phải là một bức thư trong bất kỳ ngôn ngữ và không phải là một dấu phân cách (khoảng trắng, linebreak vv .). Lưu ý rằng bạn không thể sử dụng [\P{L}\P{Z}] (trường hợp trên P có nghĩa là không có thuộc tính đó), vì điều đó có nghĩa là "mọi thứ không phải là chữ cái hoặc không khoảng trắng", gần như khớp với mọi thứ, vì chữ cái không phải khoảng trắng và ngược lại.

Thông tin thêm về Unicode

Một số ký tự unicode dường như gây ra các vấn đề do cách có thể khác nhau để mã hóa chúng (như là một điểm mã duy nhất hoặc một sự kết hợp của các điểm code). Vui lòng tham khảo regular-expressions.info để biết thêm thông tin.

+0

+1 cho giải pháp đa năng tốt nhất. Vì bạn liệt kê một vài biến thể khi không có chi tiết từ OP, bạn cũng có thể hiển thị và giải thích các mẫu như '[\ P {L}]' –

+0

Cũng lưu ý rằng ký tự '-' phải là ký tự đầu tiên hoặc cuối cùng trong danh sách hoặc nó cần phải được thoát. – Kapep

+0

'[^ \\ p {L} \\ p {Z}]' dường như cũng loại bỏ Umlauts của Đức (ä, ö, ü) (ít nhất nó cũng vậy đối với tôi: /), vì vậy "Regex khớp mọi thứ đó không phải là một chữ cái trong bất kỳ ngôn ngữ nào "dường như không chính xác 100% – Peter

13

Thử phương thức replaceAll() của lớp String.

BTW ở đây là phương thức, kiểu trả về và thông số.

public String replaceAll(String regex, 
         String replacement) 

Ví dụ:

String str = "Hello +-^ my + - friends^^^-- ^^^ +!"; 
str = str.replaceAll("[-+^]*", ""); 

Nó nên loại bỏ tất cả các { '^', '+', '-'} chars mà bạn muốn loại bỏ!

2

Sử dụng phương thức String.replaceAll() trong Java. replaceAll phải đủ tốt cho vấn đề của bạn.

13

Như đã trình bày ở đây http://developer.android.com/reference/java/util/regex/Pattern.html

Patterns được biên dịch biểu thức thông thường. Trong nhiều trường hợp, các phương pháp tiện lợi như String.matches, String.replaceAllString.split sẽ thích hợp hơn, nhưng nếu bạn cần thực hiện nhiều công việc với cùng một cụm từ thông dụng, có thể hiệu quả hơn để biên dịch nó một lần và sử dụng lại nó. Lớp Pattern và bạn đồng hành của nó, Matcher, cũng cung cấp nhiều chức năng hơn so với số lượng nhỏ mà String tiếp xúc.

public class RegularExpressionTest { 

public static void main(String[] args) { 
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()(")); 
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^(")); 
} 

public static String getOnlyDigits(String s) { 
    Pattern pattern = Pattern.compile("[^0-9]"); 
    Matcher matcher = pattern.matcher(s); 
    String number = matcher.replaceAll(""); 
    return number; 
} 
public static String getOnlyStrings(String s) { 
    Pattern pattern = Pattern.compile("[^a-z A-Z]"); 
    Matcher matcher = pattern.matcher(s); 
    String number = matcher.replaceAll(""); 
    return number; 
} 
} 

quả

String is = one 
Number is = 9196390097 
1

Bạn có thể loại bỏ đơn char như sau:

String str="+919595354336"; 

String result = str.replaceAll("\\\\+",""); 

System.out.println(result); 

OUTPUT:

919595354336 
0

Nếu bạn chỉ wa nt để thay thế bằng chữ trong java, sử dụng Pattern.quote(string) để thoát chuỗi bất kỳ thành chữ.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr) 
2

để Hủy bỏ nhân vật specail

Chuỗi t2 = "@ # $%^& *() - ';!.?, /> < + abdd";

t2 = t2.replaceAll ("\\ W +", "");

Kết quả sẽ là: abdd.

Điều này hoạt động hoàn hảo.

0

này sẽ thay thế tất cả các ký tự chữ và số trừ

replaceAll("[^A-Za-z0-9]",""); 
Các vấn đề liên quan