Làm thế nào để thay thế các ký tự đặc biệt trong một chuỗi?


91

Tôi có một chuỗi với rất nhiều ký tự đặc biệt. Tôi muốn xóa tất cả những thứ đó, nhưng vẫn giữ các ký tự theo thứ tự bảng chữ cái.

Tôi có thể làm cái này như thế nào?


Câu trả lời:


187

Điều đó phụ thuộc vào những gì bạn muốn nói. Nếu bạn chỉ muốn loại bỏ chúng, hãy làm như sau:
(Cập nhật: Rõ ràng bạn cũng muốn giữ các chữ số, hãy sử dụng các dòng thứ hai trong trường hợp đó)

String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");

hoặc tương đương:

String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");

(Tất cả những điều này có thể được cải thiện đáng kể bằng cách biên dịch trước mẫu regex và lưu trữ nó trong một hằng số)

Hoặc, với Ổi :

private static final CharMatcher ALNUM =
  CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
  .or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);

Nhưng nếu bạn muốn biến các ký tự có dấu thành một thứ gì đó hợp lý mà vẫn còn ascii, hãy xem những câu hỏi sau:


khi tôi đang sử dụng chức năng này, nó là loại bỏ tất cả các số như well.But Tôi không muốn con số để remove.just muốn loại bỏ characters.Please đặc biệt đề nghị một cái gì đó ..
Tanu

bạn nói bạn chỉ muốn bảng chữ cái. Nhưng tôi sẽ cập nhật câu trả lời của tôi trong một phút
Sean Patrick Floyd

Tôi muốn chuỗi concat nhưng với một số điều kiện như 1.If chỉ có một kết quả không concat cần kết quả 2.If là hơn 1 so với chuỗi concat trong ví dụ hình thức sau đây: ngăn xếp + trên + chảy
Tanu

2
@Tanu đó là một câu hỏi khác. Làm cho nó một cái mới
Pekka

Điều gì xảy ra nếu tôi không muốn xóa khoảng trắng? hoặc nói rằng tất cả các khoảng trắng như tab, dòng mới được thu gọn chỉ còn một dấu cách?
chết tiệt

74

Tôi đang sử dụng cái này.

s = s.replaceAll("\\W", ""); 

Nó thay thế tất cả các ký tự đặc biệt từ chuỗi.

Đây

\ w: Một ký tự từ, viết tắt của [a-zA-Z_0-9]

\ W: Một ký tự không phải từ


Không hoạt động đối với <script> alert ('XSS Attack') </script>. Làm cách nào để xóa các ký tự '<', '>', '\'?
Manoj

11

Bạn có thể sử dụng phương pháp sau để giữ các ký tự chữ và số.

replaceAll("[^a-zA-Z0-9]", "");

Và nếu bạn chỉ muốn giữ lại các ký tự chữ cái, hãy sử dụng

replaceAll("[^a-zA-Z]", "");

5
Để sử dụng không gianreplaceAll("[^a-zA-Z0-9 ]", "");
Qamar

6

Thay thế bất kỳ ký tự đặc biệt nào bằng

replaceAll("\\your special character","new character");

ví dụ: để thay thế tất cả sự xuất hiện của * bằng khoảng trắng

replaceAll("\\*","");

* câu lệnh này chỉ có thể thay thế một loại ký tự đặc biệt tại một thời điểm


Chắc chắn những gì tôi đang tìm kiếm khi tôi nhìn thấy tiêu đề câu hỏi "Làm thế nào để thay thế các ký tự đặc biệt trong một chuỗi?" cảm ơn!
Mr.Drew

2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

Ở đây, tất cả các ký tự đặc biệt ngoại trừ dấu cách, dấu phẩy và dấu và được thay thế. Bạn cũng có thể bỏ qua dấu cách, dấu phẩy và dấu và bằng biểu thức chính quy sau.

string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");

Trong đó Đầu vào là chuỗi mà chúng ta cần thay thế các ký tự.


2

Theo ví dụ về câu trả lời của Andrzej Doyle , tôi nghĩ giải pháp tốt hơn là sử dụng org.apache.commons.lang3.StringUtils.stripAccents():

package bla.bla.utility;

import org.apache.commons.lang3.StringUtils;

public class UriUtility {
    public static String normalizeUri(String s) {
        String r = StringUtils.stripAccents(s);
        r = r.replace(" ", "_");
        r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
        return r;
    }
}

0

Bạn có thể sử dụng các biểu thức chính quy cơ bản trên các chuỗi để tìm tất cả các ký tự đặc biệt hoặc sử dụng các lớp mẫu và đối sánh để tìm kiếm / sửa đổi / xóa các chuỗi do người dùng xác định. Liên kết này có một số ví dụ đơn giản và dễ hiểu cho cụm từ thông dụng: http://www.vogella.de/articles/JavaRegularExpressions/article.html


0

Bạn có thể lấy unicode cho ký tự rác đó từ công cụ Charactermap tool trong window pc và thêm \ u eg \ u00a9 cho ký hiệu bản quyền. Bây giờ bạn có thể sử dụng chuỗi đó với ký tự rác cụ thể đó, không xóa bất kỳ ký tự rác nào mà thay thế bằng unicode thích hợp.



-1
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();

Bạn có thể giải thích regex một chút không?
stdunbar

tôi khuyên bạn nên thêm ghi chú vào phần câu trả lời để giải thích mã của bạn. Vui lòng đọc thêm về cách viết câu trả lời hay .
Joe Ferndz

Điều này không thực sự trả lời câu hỏi. Nếu bạn có câu hỏi khác, bạn có thể hỏi bằng cách nhấp vào Đặt câu hỏi . Bạn cũng có thể thêm tiền thưởng để thu hút nhiều sự chú ý hơn đến câu hỏi này khi bạn đã có đủ danh tiếng . - Từ đánh giá
Aman Garg
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.