Как заменить специальные символы в строке?

91

У меня есть строка с множеством специальных символов. Я хочу удалить все это, но сохранить буквы алфавита.

Как я могу это сделать?

Тану
источник
Посмотрите эту ветку: stackoverflow.com/questions/3438854/…
Cyril Gandon

Ответы:

187

Это зависит от того, что вы имеете в виду. Если вы просто хотите избавиться от них, сделайте следующее:
(Обновление: по-видимому, вы также хотите сохранить цифры, в этом случае используйте вторые строки)

String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");

или эквивалент:

String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");

(Все это можно значительно улучшить, предварительно скомпилировав шаблон регулярного выражения и сохранив его в константе)

Или с Гуавой :

private static final CharMatcher ALNUM =
  CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
  .or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);

Но если вы хотите превратить акцентированные символы во что-то разумное, все еще в формате ascii, взгляните на эти вопросы:

Шон Патрик Флойд
источник
когда я использую эту функцию, она также удаляет все числа. но я не хочу, чтобы числа удалялись. просто хочу удалить специальные символы. Пожалуйста, предложите что-нибудь ..
Tanu
ну, вы сказали, что хотите только алфавит. Но я обновлю свой ответ через минуту
Шон Патрик Флойд
Я хочу объединить строку, но с некоторым условием, например 1. Если есть только один результат, объединение не требуется 2. Если результат больше 1, чем строка concat в следующем примере формы: stack + over + flow
Tanu
2
@ Тану, это другой вопрос. Сделай это новым
Пекка
Что делать, если я не хочу удалять пробелы? или скажем, что все пробелы, такие как вкладки, новые строки, свернулись как только один пробел?
проклятый
74

Я использую это.

s = s.replaceAll("\\W", ""); 

Он заменяет все специальные символы из строки.

Вот

\ w: словесный символ, сокращение от [a-zA-Z_0-9]

\ W: символ, не являющийся словом

Дхирал Пандья
источник
Не работает для <script> alert ('XSS Attack') </script>. Как удалить символы '<', '>', '\'?
Манодж
11

Вы можете использовать следующий метод, чтобы сохранить буквенно-цифровые символы.

replaceAll("[^a-zA-Z0-9]", "");

И если вы хотите сохранить только алфавитные символы, используйте это

replaceAll("[^a-zA-Z]", "");
dhuma1981
источник
6
Для использования в космосеreplaceAll("[^a-zA-Z0-9 ]", "");
Камар
6

Замените любые специальные символы на

replaceAll("\\your special character","new character");

пример: заменить все вхождения * пробелом

replaceAll("\\*","");

* этот оператор может заменять только один тип специальных символов за раз

Кришнамурти
источник
Определенно то, что я искал, когда увидел вопрос с заголовком «Как заменить специальные символы в строке?» Благодарность!
Мистер Дрю 02
2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

Здесь заменяются все специальные символы, кроме пробела, запятой и амперсанда. Вы также можете опустить пробел, запятую и амперсанд в следующем регулярном выражении.

string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");

Где Input - это строка, в которой нам нужно заменить символы.

Майк Кларк
источник
2

Следуя примеру ответа Анджея Дойла , я думаю, что лучшим решением будет использовать org.apache.commons.lang3.StringUtils.stripAccents():

package bla.bla.utility;

import org.apache.commons.lang3.StringUtils;

public class UriUtility {
    public static String normalizeUri(String s) {
        String r = StringUtils.stripAccents(s);
        r = r.replace(" ", "_");
        r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
        return r;
    }
}
Марко Сулла
источник
0

Вы можете использовать базовые регулярные выражения для строк, чтобы найти все специальные символы, или использовать классы шаблонов и сопоставлений для поиска / изменения / удаления строк, определенных пользователем. По этой ссылке есть несколько простых и понятных примеров регулярных выражений: http://www.vogella.de/articles/JavaRegularExpressions/article.html

Мадху Нандан
источник
0

Вы можете получить Unicode для этого нежелательного символа из инструмента карты символов в окне ПК и добавить \ u, например, \ u00a9 для символа авторского права. Теперь вы можете использовать эту строку с этим конкретным символом нежелательной почты, не удаляя никакие символы нежелательной почты, а заменяя ее правильным Unicode.

Mundroid
источник
0

Для пробелов используйте "[^ az AZ 0-9]" этот шаблон

Мухаммад Ахсан
источник
-1
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();
Snow Sior
источник
Не могли бы вы немного объяснить регулярное выражение?
stdunbar
Я рекомендую вам добавить примечания в раздел ответов, чтобы объяснить свой код. Пожалуйста, прочтите больше о том, как писать хорошие ответы .
Джо Ферндз,
Это не совсем ответ на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав « Задать вопрос» . Вы также можете добавить награду, чтобы привлечь больше внимания к этому вопросу, когда у вас будет достаточно репутации . - Из отзыва
Aman Garg,