Làm cách nào để xóa các ký tự đặc biệt khỏi một chuỗi?


90

Tôi muốn xóa các ký tự đặc biệt như:

- + ^ . : ,

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


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

3
Cụm từ "ký tự đặc biệt" được sử dụng quá mức đến mức 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ể này tôi muốn xóa", thì hãy làm như Thomas gợi ý và tạo mẫu của bạn với lớp ký tự regex và replaceAllloại bỏ chúng. Nếu bạn có thêm yêu cầu bí truyền, hãy chỉnh sửa câu hỏi. :)
Ray Toal

1
đó không phải là các 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à ... dù sao, như Ray đã nói, hãy làm một replaceAllcho chúng hoặc, thực hiện phân tích cú pháp chuỗi, thêm các ký tự không phải là các ký tự bạn muốn lấy ra vào một chuỗi khác và cuối cùng chỉ cần thực hiện dấu + = cho một Chuỗi mà bạn sẽ trả về.
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );- tìm deleteChars tại đây
Kaplan

Câu trả lời:


255

Điều đó phụ thuộc vào những gì bạn xác định là các ký tự đặc biệt, nhưng hãy thử replaceAll(...):

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

Lưu ý rằng ^ ký tự không được là ký tự đầu tiên trong danh sách, vì sau đó bạn phải thoát khỏi nó hoặc nó có nghĩa là "bất kỳ ngoại trừ các ký tự này".

Một lưu ý khác: -ký tự cần phải là ký tự đầu tiên hoặc cuối cùng trong danh sách, nếu không bạn 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 ký tự trong phạm vi :đến ,).

Vì vậy, để duy trì ổn định và không phụ thuộc vào vị trí nhân vật, bạn có thể muốn thoát khỏi tất cả những nhân vật mà có một ý nghĩa đặc biệt trong biểu thức thông thường (danh sách sau đây là chưa hoàn chỉnh, vì vậy hãy ý thức về nhân vật khác như (, {, $ vv) :

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


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

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

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

Điều này có nghĩa là: thay thế mọi thứ không phải là ký 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 khảo của regular-expressions.info .

Đây là phương pháp thay thế ít hạn chế hơn cho phương pháp "xác định ký tự được phép", như Ray đề xuất:

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

Regex khớp với mọi thứ không phải là chữ cái trong bất kỳ ngôn ngữ nào và không phải là dấu phân cách (khoảng trắng, ngắt dòng, v.v.). Lưu ý rằng bạn không thể sử dụng[\P{L}\P{Z}] (chữ hoa 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 phải khoảng trắng", hầu như khớp với mọi thứ, vì các chữ cái không phải là khoảng trắng và ngược lại.

Thông tin bổ sung về Unicode

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


+1 cho giải pháp cho mục đích chung tốt nhất. Vì bạn đang niêm yết một vài biến thể trong sự vắng mặt của 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}]
Ray Toal

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, nếu không ký tự cần phải được thoát ra.
kapex

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

@Peter nó không loại bỏ những ký tự đó trong các thử nghiệm của tôi. Có thể có một vấn đề khác trong trường hợp của bạn, ví dụ: một mã hóa văn bản khác. Tôi sẽ thêm một liên kết để biết thêm thông tin.
Thomas

1
@Thomas String result = yourString.replaceAll("[^\w\s]","");làm lỗiInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth

40

Điều này sẽ thay thế tất cả các ký tự ngoại trừ chữ và số

replaceAll("[^A-Za-z0-9]","");

Thao tác này cũng sẽ xóa các ký tự tiếng Ả Rập.
S0haib Nasir

1
Đây là câu trả lời tốt nhất.
Marius Razvan Varvarei

18

Như được mô tả tại đây http://developer.android.com/reference/java/util/regex/Pattern.html

Các mẫu được biên dịch các biểu thức chính quy. Trong nhiều trường hợp, các phương thức tiện lợi như String.matches, String.replaceAllString.splitsẽ được ưu tiên hơn, nhưng nếu bạn cần thực hiện nhiều thao tác với cùng một biểu thức chính quy, thì việc biên dịch một lần và sử dụng lại nó có thể hiệu quả hơn. Lớp Pattern và đồ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 hiển thị.

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;
 }
}

Kết quả

String is = one
Number is = 9196390097

Thao tác này sẽ xóa các ký tự tiếng Ả Rập
S0haib Nasir

15

Hãy thử replaceAll()phương pháp của Stringlớp.

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

public String replaceAll(String regex,
                         String replacement)

Thí dụ:

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

Nó sẽ xóa tất cả các ký tự {'^', '+', '-'} mà bạn muốn xóa!


6

Để xóa ký tự đặc biệt

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

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

Đầu ra sẽ là: abdd.

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


1
sẽ nhận được nhân vật chạy thoát bất hợp pháp trong chuỗi chữ
John Joe

Thao tác này cũng sẽ xóa các khoảng trắng nếu bạn muốn giữ các khoảng trắng sau đó sử dụng t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan

2

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


1

Bạn có thể loại bỏ các ký tự đơn như sau:

String str="+919595354336";

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

 System.out.println(result);

ĐẦU RA:

919595354336

0

Nếu bạn chỉ muốn thực hiện thay thế theo nghĩa đen trong java, hãy sử dụng Pattern.quote(string)để thoát bất kỳ chuỗi nào thành một ký tự.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
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.