2013-01-16 169 views
7

thể trùng lặp:
Replacing all non-alphanumeric characters with empty stringsloại bỏ tất cả các ký tự đặc biệt trong java

import java.util.Scanner; 
import java.util.regex.*; 
public class io{ 
public static void main(String args[]){ 
Scanner scan = new Scanner(System.in); 
String c; 
if((c=scan.nextLine())!=null) 
{ 
Pattern pt = Pattern.compile("[^a-zA-Z0-9]"); 
Matcher match= pt.matcher(c); 
    while(match.find()){ 
     c=c.replace(Character.toString(c.charAt(match.start())),""); 
     } 
    System.out.println(c); 
     } 
    } 
} 

Trường hợp 1

Input : hjdg$h&jk8^i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdgh&jk8^issh6 

Trường hợp 2

Input : hjdgh&jk8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjk8i0ssh6 

trường hợp 3

Input : hjdgh&j&k8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjki0ssh6 

Bất cứ ai hãy giúp tôi tìm ra, những gì là sai trong logic đang của tôi ??

+2

xem xét nhìn vào Java quy ước đặt tên và định dạng mã nguồn của bạn trước khi bạn gửi câu hỏi. – rtheunissen

+0

Hãy thử '[^ az $] | [^ AZ $] | [^ 0-9 $]' – noMAD

+0

@ paranoid-android thực sự, tôi đã viết mã trên trên notepad .. :( – Ravi

Trả lời

15

sử dụng [\\W+] hoặc "[^a-zA-Z0-9]" như regex để phù hợp với bất kỳ ký tự đặc biệt và cũng sử dụng String.replaceAll (regex, String) để thay thế cho charecter SPL với một chuỗi rỗng. hãy nhớ là arg đầu tiên của String.replaceAll là một regex bạn phải thoát khỏi nó bằng dấu gạch chéo ngược để đối xử với em như một charcter theo nghĩa đen.

  String c= "hjdg$h&jk8^i0ssh6"; 
     Pattern pt = Pattern.compile("[^a-zA-Z0-9]"); 
     Matcher match= pt.matcher(c); 
     while(match.find()) 
     { 
      String s= match.group(); 
     c=c.replaceAll("\\"+s, ""); 
     } 
     System.out.println(c); 
+0

'c = c.replace (match.group()," ");' cái này cũng hoạt động. Tại sao ?? – Ravi

+0

@var___ lưu ý rằng tôi đã sử dụng replaceAll lấy args đầu tiên là regex, trong khi bạn đang sử dụng whihc thay thế không lấy regex, do đó nó hoạt động .. :) – PermGenError

+0

ok .. tôi đã nhận nó ngay bây giờ .. cảm ơn !! – Ravi

9

Bạn có thể đọc các dòng và thay thế tất cả ký tự đặc biệt một cách an toàn theo cách này.
Hãy nhớ rằng nếu bạn sử dụng \\W, bạn sẽ không thay thế gạch dưới.

Scanner scan = new Scanner(System.in); 

while(scan.hasNextLine()){ 
    System.out.println(scan.nextLine().replaceAll("[^a-zA-Z0-9]", ""); 
} 
+0

nếu tôi muốn sử dụng gói 'regex' – Ravi

+0

Vâng, nếu đó là một nhiệm vụ và bạn phải sử dụng gói' regex', thì bạn có thể xem xét một giải pháp phức tạp không cần thiết. muốn sử dụng gói 'regex'? – rtheunissen

+0

Vì vậy, tôi có thể tìm hiểu thêm về' reg ex' package – Ravi

2

Vấn đề của bạn là các chỉ số được trả về bởi match.start() tương ứng với vị trí của ký tự như xuất hiện trong chuỗi gốc khi bạn so khớp; tuy nhiên, khi bạn viết lại chuỗi c mỗi lần, các chỉ mục này trở thành không chính xác.

Cách tiếp cận tốt nhất để giải quyết này là sử dụng replaceAll, ví dụ:

 System.out.println(c.replaceAll("[^a-zA-Z0-9]", "")); 
Các vấn đề liên quan