Próbowałem tego użyć, ale nie działało
return value.replaceAll("/[^A-Za-z0-9 ]/", "");
Próbowałem tego użyć, ale nie działało
return value.replaceAll("/[^A-Za-z0-9 ]/", "");
Odpowiedzi:
Zastosowanie [^A-Za-z0-9]
.
Uwaga: usunięto spację, ponieważ zwykle nie jest to uważane za alfanumeryczne.
Próbować
return value.replaceAll("[^A-Za-z0-9]", "");
lub
return value.replaceAll("[\\W]|_", "");
return value.replaceAll("\\W", "");
Należy pamiętać, że [^a-zA-Z]
zastąpi znaki, które nie znajdują się w zakresie znaków AZ / az. Oznacza to, że znaki specjalne podoba é
,ß
itd. Lub cyrylicą i takie będą usuwane.
Jeśli zamiana tych znaków nie jest pożądana, użyj zamiast tego wstępnie zdefiniowanych klas znaków:
str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");
PS: \p{Alnum}
nie osiąga tego efektu, działa tak samo jak [A-Za-z0-9]
.
[^\\p{IsAlphabetic}\\p{IsDigit}]
działa dobrze.
{IsDigit}
dla mnie nie działa i {Digit}
jest to, że próbuję tego na Androidzie. System Android jest UNICODE_CHARACTER_CLASS
domyślnie włączony. Dzięki za odprawę.
Możesz także spróbować tego prostszego wyrażenia regularnego:
str = str.replaceAll("\\P{Alnum}", "");
str.replaceAll("[^\\p{Alnum}\\s]", "")
\\p{Alnum}\\p{Space}
.
Zrobiłem tę metodę tworzenia nazw plików:
public static String safeChar(String input)
{
char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
char[] charArray = input.toString().toCharArray();
StringBuilder result = new StringBuilder();
for (char c : charArray)
{
for (char a : allowed)
{
if(c==a) result.append(a);
}
}
return result.toString();
}
value.replaceAll("[^A-Za-z0-9]", "")
[^abc]
Kiedy daszek^
pojawia się jako pierwszy znak w nawiasach kwadratowych, neguje wzór. Ten wzór pasuje do dowolnego znaku oprócz a lub b lub c.
Patrząc na słowo kluczowe jako dwie funkcje:
[(Pattern)] = match(Pattern)
[^(Pattern)] = notMatch(Pattern)
Ponadto w odniesieniu do wzoru:
A-Z = all characters included from A to Z
a-z = all characters included from a to z
0=9 = all characters included from 0 to 9
Dlatego zastąpi wszystkie znaki NIE uwzględnione we wzorcu
Jeśli chcesz również zezwolić na znaki alfanumeryczne, które nie należą do zestawu znaków ascii, jak na przykład niemiecki umlaut, możesz rozważyć użycie następującego rozwiązania:
String value = "your value";
// this could be placed as a static final constant, so the compiling is only done once
Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);
value = pattern.matcher(value).replaceAll("");
Pamiętaj, że użycie flagi UNICODE_CHARACTER_CLASS może mieć wpływ na obniżenie wydajności (patrz javadoc tej flagi)
Prosta metoda:
public boolean isBlank(String value) {
return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}
public String normalizeOnlyLettersNumbers(String str) {
if (!isBlank(str)) {
return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
} else {
return "";
}
}
public static void main(String[] args) {
String value = " Chlamydia_spp. IgG, IgM & IgA Abs (8006) ";
System.out.println(value.replaceAll("[^A-Za-z0-9]", ""));
}
wyjście: ChlamydiasppIgGIgMIgAAbs8006
Github: https://github.com/AlbinViju/Learning/blob/master/StripNonAlphaNumericFromString.java
CharMatcher firmy Guava zapewnia zwięzłe rozwiązanie:
output = CharMatcher.javaLetterOrDigit().retainFrom(input);