2013-01-16 13 views
7

Powiel możliwe:
Replacing all non-alphanumeric characters with empty stringsusunąć wszystkie znaki specjalne w Javie

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

Case 1

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

Przypadek 2

Input : hjdgh&jk8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjk8i0ssh6 

Case 3

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

Każdy, proszę mi pomóc, aby dowiedzieć się, co jest nie tak w moim logiki kodu ??

+2

rozważyć patrząc na Java konwencje nazewnictwa i formatowania kodu źródłowego przed złożeniem Ci pytanie. – rtheunissen

+0

Wypróbuj '[^ az $] | [^ AZ $] | [^ 0-9 $]' – noMAD

+0

@ paranoid-android faktycznie, napisałem powyższy kod w notatniku .. :( – Ravi

Odpowiedz

15

użycie [\\W+] lub "[^a-zA-Z0-9]" jak regex do pasuje do żadnych znaków specjalnych, a także korzystać z String.replaceAll (regex, String) aby zastąpić SPL charecter z pustym ciągiem. pamiętajcie, że pierwszym argumentem String.replaceAll jest wyrażenie regularne, któremu trzeba uciec z odwrotnym ukośnikiem, aby traktować je jako dosłowny znak.

  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()," ");' ten również działa. Czemu ?? – Ravi

+0

@var___ uwaga, że ​​użyłem replaceAll, który bierze pierwsze argumenty jako regex, podczas gdy używasz zamienia whihc nie bierze regex, więc działa .. :) – PermGenError

+0

ok .. Mam to teraz .. dzięki !! – Ravi

9

Możesz odczytywać linie i zastępować wszystkie znaki specjalne w ten sposób.
Należy pamiętać, że jeśli użyjesz \\W, nie zastąpisz podkreśleń.

Scanner scan = new Scanner(System.in); 

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

co jeśli chcę użyć pakietu 'regex' – Ravi

+0

Cóż, jeśli chodzi o zlecenie i MUSISZ skorzystać z pakietu' regex', to być może szukasz niepotrzebnie złożonego rozwiązania. chcesz użyć pakietu 'regex'? – rtheunissen

+0

Dzięki temu mogę dowiedzieć się więcej o' reg ex' package – Ravi

2

Twój problem jest, że wskaźniki zwracane przez match.start() odpowiadają położeniu charakteru wyglądał w oryginalnym ciąg kiedy go dopasowane; jednak, gdy przepisujesz ciąg c za każdym razem, te indeksy stają się niepoprawne.

Najlepszym podejściem do rozwiązania tego problemu jest użycie replaceAll, na przykład:

 System.out.println(c.replaceAll("[^a-zA-Z0-9]", ""));