2013-03-06 11 views
9

Próbuję napisać kod Java, który usunie wszystkie niechciane znaki i niech będą tylko te znajdujące się na białej liście.Usuń wszystkie znaki z łańcucha, które nie są na białej liście

Przykład:

String[] whitelist = {"a", "b", "c"..."z", "0"..."9", "[", "]",...} 

Chcę tam tylko litery (wielkie) i niższy i cyfry + kilka kolejnych znaków Dodałbym. Następnie rozpocznę cykl for() dla każdej litery w łańcuchu i zastąpię go pustym łańcuchem, jeśli nie znajduje się on na białej liście.

Ale to nie jest dobre rozwiązanie. Może można to zrobić w jakiś sposób używając wzorca (regex)? Dzięki.

+1

'Może się to odbywać za pomocą wzoru (jakoś regex)' Tak, masz rację . Możesz zacząć [tutaj] (http://www.regexplanet.com/advanced/java/index.html) – ppeterka

+0

Jakie znaki są dozwolone? W zależności od wymagań, wyrażenie regularne może być bardzo różne. – nhahtdh

Odpowiedz

21

Tak, można użyć String.replaceAll która pobiera regex:

String input = "BAD good {} []"; 
String output = input.replaceAll("[^a-z0-9\\[\\]]", ""); 
System.out.println(output); // good[] 

Albo w Guava można użyć CharMatcher:

CharMatcher matcher = CharMatcher.inRange('a', 'z') 
          .or(CharMatcher.inRange('0', '9')) 
          .or(CharMatcher.anyOf("[]")); 
String input = "BAD good {} []"; 
String output = matcher.retainFrom(input); 

To tylko pokazuje wersji pisanej małymi literami, dzięki czemu łatwiej wykazać. Aby uwzględnić wielkie litery, użyj wyrażenia regularnego (i innych dowolnych symboli), używając "[^A-Za-z0-9\\[\\]]" - i dla CharMatcher możesz to zrobić pod .

+0

W pierwszym kodzie, używając wyrażenia regularnego, w jaki sposób dodać kolejne znaki do białej listy (nie tylko [i], ale także spacja i następne znaki)? – PerwinCZ

+4

Ponieważ PerwinCZ szuka małych i wielkich liter, powinno to być '[^ A-Za-z0-9 \\ [\\]]'? – jonhopkins

+0

@jonhopkins: Właśnie napisałem, co było w kodzie - zmienię, żeby to wyjaśnić. –

2

można spróbować i dopasować wszystko, co nie jest w białej listy i zastąpić go z pustym ciągiem:

String in = "asng $%& 123"; 
//this assumes your whitelist contains word characters and whitespaces, adapt as needed 
System.out.println(in.replaceAll("[^\\w\\s]+", "")); 
Powiązane problemy