2010-12-13 67 views
9

tôi muốn loại bỏ tất cả các ký tự sau đây từ chuỗi của tôiLàm thế nào để loại bỏ một số ký tự từ chuỗi của tôi

"> [], -"

tại im khoảnh khắc làm điều này. nhưng phải có một cách hiệu quả hơn

newString = myString.replace(">","").replace("[","").replace("]","").... 
+0

Vâng, bạn có thể sử dụng regex, nhưng sau đó bạn sẽ phải thoát ký tự đặc biệt. Và bạn đang nói về loại hiệu quả nào? Thời gian chạy hoặc của riêng bạn (tức là dòng mã)? –

+0

Lo lắng về "hiệu quả" của các vấn đề cụ thể này cho thấy tối ưu hóa sớm; Tôi rất nghi ngờ rằng phương pháp * này * là nút cổ chai của ứng dụng của bạn. Hãy dành thời gian của bạn để tìm hiểu xem ứng dụng của bạn ở đâu * thực sự * chậm và cần tối ưu hóa. – Bombe

Trả lời

9

Dùng regex mô tả tất cả các ký tự mà bạn muốn thay thế, với phương pháp thay thế tất cả những gì phù hợp với regex:

newString = myString.replaceAll("[<>\\[\\],-]", ""); 

(chỉnh sửa: Tôi không nghĩ <> có nghĩa vụ phải được thoát, trên thực tế Và tôi đã quên tăng gấp đôi các dấu gạch chéo ngược vì chúng sẽ được diễn giải hai lần: một lần bởi trình biên dịch Java, và một lần nữa bằng công cụ biểu thức chính quy.)

+0

hoạt động như một nét duyên dáng. cảm ơn. – code511788465541441

+0

Nếu tôi muốn giữ các dòng mới thì sao? – Mann

1
newString = myString.replaceAll("[>\\[\\],-]", ""); 

Dấu gạch chéo ngược là để thoát khỏi '[' vì đối số đầu tiên thực sự là một biểu thức chính quy.

+0

Đánh bại tôi với nó, +1 –

+0

nó không hoạt động – code511788465541441

+0

Uhh ... bạn sẽ muốn bao bọc các ký tự đó trong một lớp nhân vật ('[]') bởi vì bạn đang tìm kiếm bất kỳ cái nào trong số chúng, không phải là một chuỗi của tất cả chúng trong một hàng ... –

0

Bạn có thể lặp qua từng ký tự, nối từng ký tự vào một StringBuilder() trừ khi chúng khớp với một trong các ký tự bạn đang xóa.

Nhưng tôi không chắc chắn rằng sẽ nhanh hơn rất nhiều.

1
newString = myString.replaceAll("[>\\[\\],-]", ""); 
+0

loại công việc nhưng loại bỏ nó nhiều hơn tôi muốn. nó đã xóa alm ost của tất cả dữ liệu – code511788465541441

+0

@ user521180: đã chỉnh sửa một chút, hãy thử lại một lần nữa. Bạn có thể cho chúng tôi mẫu dữ liệu nếu nó vẫn không hoạt động theo cách bạn muốn không? – darioo

2

Sử dụng thay thế/thay thếTất cả các phương pháp tạo ra một mẫu mới được biên soạn mỗi lần. Vì vậy, nếu bạn đang làm điều này nhiều lần tôi mạnh mẽ sẽ đề nghị hoặc lặp qua các ký tự hoặc tạo ra một biểu thức chính quy duy nhất để sử dụng nhiều lần.

+0

Vui lòng không tự mình lặp lại các ký tự; nhưng làm "tạo regex" (một ví dụ 'Pattern' mới, trong Java) nếu điều này là quan trọng. Xem tài liệu Java cho java.util.regex.Pattern, cũng cung cấp một cái nhìn tổng quan cơ bản về cú pháp biểu thức chính quy được hỗ trợ bởi công cụ regex của Java. –

2

Hiệu quả hoạt động hiệu quả hơn: có. Bạn không thể "xóa" các ký tự từ một Chuỗi để bạn có thể tạo một ký tự mới. Xem xét giải pháp dựa trên chuyển đổi/trường hợp:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < s.length(); i++) { 
    switch(s.getCharAt(i)) { 
    case '>': 
    case '[': 
    case ']': 
    case ',': 
    case '-': break; 
    default: sb.append(s.getCharAt(i)); 
    } 
} 
s = sb.toString(); 
+0

Giải pháp tốt cho vấn đề này! – Rahul

6

Bạn có thể sử dụng phương thức replaceAll của lớp String.

Bạn có thể tạo một lớp nhân vật bao gồm các ký tự bạn muốn xóa. Và chuỗi thay thế sẽ là chuỗi trống "".

Nhưng các ký tự bạn muốn xóa mà bạn sẽ đặt trong lớp ký tự có thể là ký tự meta regex và do đó cần phải được thoát. Bạn có thể tự thoát chúng khi nhiều câu trả lời hiển thị, cách khác bạn có thể sử dụng phương thức Pattern.quote().

String charToDel = ">[],-"; 
String pat = "[" + Pattern.quote(charToDel) + "]"; 
String str = "a>b[c]d,e-f"; 
str = str.replaceAll(pat,""); 

See it

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