Заміна всіх не алфавітно-цифрових символів порожніми рядками


197

Я спробував це використати, але не вийшло -

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
Хлопці, ви забули, що існують інші алфавіти, крім латинських.
Матева

2
Але якщо ви хочете, наприклад, перевірити ім'я хоста, було б добре виключити недійсні алфавіти.
Гурнард

Відповіді:


245

Використовуйте [^A-Za-z0-9].

Примітка: видалено пробіл, оскільки це, як правило, не вважається буквено-цифровим.


10
Не має бути місця в кінці класу символів.
Ендрю Даффі

6
Він, мабуть, звик програмувати в PHP.
Вільям

10
@William - прикро, що PHP тепер отримує кредит на PCRE
Thomas Dignan

reg exp в порядку, просто видаліть "/" з рядка regexp з value.replaceAll ("/ [^ A-Za-z0-9] /", ""); to value.replaceAll ("[^ A-Za-z0-9]", ""); вам не потрібен "/" всередині регулярного
гекса

128

Спробуйте

return value.replaceAll("[^A-Za-z0-9]", "");

або

return value.replaceAll("[\\W]|_", "");

4
З підкресленнями,return value.replaceAll("\\W", "");
erickson

Звичайно. Компілятори чудово помічають таку річ.
Ендрю Даффі

1
Другий не відповідає на запитання. Що з такими персонажами, як: / \ тощо?
ВВ.

67

Ви повинні знати, що [^a-zA-Z]замінять символи, які не знаходяться в діапазоні символів AZ / az. Це означає, що спеціальні символи, наприклад é, ßтощо, або кириличні символи, і такі будуть видалені.

Якщо заміна цих символів не потрібна, використовуйте наперед задані класи символів:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

PS: \p{Alnum}не досягає цього ефекту, він діє так само, як [A-Za-z0-9].


11
Велике спасибі за цю посаду - мені це було дуже корисно. Крім того, я вважаю, що це фактична відповідь на питання. Латинський алфавіт - не єдиний у світі!
Матева

2
Власне, зазначений регулярний вираз вважатиме "^" дійсним символом, оскільки лише перше виникнення "^" нехтує значенням виділення. [^\\p{IsAlphabetic}\\p{IsDigit}]працює добре.
Богдан Кличук

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html визначає IsAlphabetic та IsDigit як бінарні властивості. Альфа та цифра - це символьні класи POSIX (тільки для США-ASCII). За винятком вказаного прапора docs.oracle.com/javase/10/docs/api/java/util/regex/…
Andre Steingress

@AndreSteingress Правильно, причина {IsDigit}для мене не працює і {Digit}полягає в тому, що я намагаюся це зробити на Android. А Android UNICODE_CHARACTER_CLASSувімкнено за замовчуванням. Дякуємо за допуск.
Якуб Турківський

Як дозволити лише Альфа, Цифру та Емоджі?
Роберт Гудрік

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

Це залишить місця недоторканими. Я припускаю, що ви цього хочете. В іншому випадку видаліть простір з регулярного виразу.


21

Ви також можете спробувати цей простіший регулярний вираз:

 str = str.replaceAll("\\P{Alnum}", "");

2
Або, зберігаючи пробіли:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

Або \\p{Alnum}\\p{Space}.
члени звучання

10

Регулярні вирази Java не вимагають, щоб ви ставили пряму косу рису ( /) або будь-який інший розділовий знак навколо регулярного виразу , на відміну від інших мов, таких як Perl, наприклад.


8

Я створив цей метод створення імен файлів:

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

5
Це досить жорстоко. Regex - це шлях до ситуації з ОП.
Майкл Петерсон

1
Ти маєш рацію, краще підсумок. Але в той час, як я і «Реджекс» я не погодилися.
zneo

Ага, чи справді хтось так добре ладнає з регексом? ;)
Майкл Петерсон

6

Рішення:

value.replaceAll("[^A-Za-z0-9]", "")

Пояснення:

[^abc] Коли каре ^з'являється як перший символ у квадратних дужках, це заперечує візерунок. Цей візерунок відповідає будь-якому символу, крім a або b або c.

Дивлячись на ключове слово як на дві функції:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

Більше того, щодо візерунка:

  • 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

Тому він замінить усі символи, які НЕ включені в шаблон


3

Якщо ви також хочете дозволити буквено-цифрові символи, які не належать до набору символів ascii, як, наприклад, німецький umlaut's, ви можете розглянути наступне рішення:

 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("");

Зверніть увагу, що за використання прапора UNICODE_CHARACTER_CLASS може бути застосовано покарання за виконання (див. Javadoc цього прапора)


1

Простий метод:

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


1

Використовуючи Guava, ви можете легко комбінувати критерії різного типу. Для конкретного рішення ви можете використовувати:

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.