Вы, по-видимому, уже знаете, что такое регулярное выражение, исходя из того, как вы пометили свой вопрос. Вы пробовали читать документацию по Stringклассу? В частности, ищите слово «регулярное выражение»; есть несколько методов, и немного подумав, вы подскажете, как действовать ... :)
Карл Кнехтель
3
Фраза «особый символ» настолько злоупотреблена, что почти полностью лишена смысла. Если вы имеете в виду: «У меня есть этот список конкретных символов, которые я хочу удалить», то сделайте то, что предлагает Томас, и сформируйте свой шаблон с классом символов регулярного выражения и replaceAllпрочь. Если у вас есть более эзотерические требования, отредактируйте вопрос. :)
Ray Toal
1
это не специальные символы ... это: äâêíìéè, поскольку они не являются вашими обычными 1-байтовыми типами символов, такими как - + ^, ... в любом случае, как заявил Рэй, либо выполните replaceAllдля них, либо выполните синтаксический анализ строка, добавьте символы, которые не являются символами, которые вы хотите вывести, в другую строку, и в конце просто сделайте + = для строки, которую вы вернете.
Это зависит от того, что вы определяете как специальные символы, но попробуйте replaceAll(...):
String result = yourString.replaceAll("[-+.^:,]","");
Обратите внимание, что этот ^символ не должен быть первым в списке, поскольку в этом случае вам придется либо экранировать его, либо он будет означать «любой, кроме этих символов».
Еще одно примечание: -символ должен быть первым или последним в списке, иначе вам придется его экранировать, иначе он определит диапазон (например, :-,будет означать «все символы в диапазоне :до» ,).
Итак, чтобы сохранить последовательность и не зависеть от позиционирования символов, вы можете захотеть экранировать все те символы, которые имеют особое значение в регулярных выражениях (следующий список не является полным, поэтому имейте в виду другие символы, такие как (, {и $ т. Д.) :
String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");
Если вы хотите избавиться от всех знаков препинания и символов, попробуйте это регулярное выражение: \p{P}\p{S}(имейте в виду, что в строках Java вам придется избегать обратных косых черт :) "\\p{P}\\p{S}".
Третий способ может быть примерно таким, если вы можете точно определить, что следует оставить в вашей строке:
String result = yourString.replaceAll("[^\\w\\s]","");
Это означает: заменить все, что не является символом слова (в любом случае az, 0-9 или _) или пробелом.
Изменить: обратите внимание, что есть несколько других шаблонов, которые могут оказаться полезными. Однако я не могу объяснить их все, поэтому загляните в справочный раздел regular-expressions.info .
Вот менее строгая альтернатива подходу «определения разрешенных символов», предложенная Рэем:
String result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");
Регулярное выражение соответствует всему, что не является буквой на любом языке и не является разделителем (пробелы, перенос строки и т. Д.). Обратите внимание, что вы не можете использовать [\P{L}\P{Z}](верхний регистр P означает отсутствие этого свойства), поскольку это будет означать «все, что не является буквой или не пробелом», что почти соответствует всему, поскольку буквы не являются пробелами и наоборот.
Дополнительная информация о Unicode
Некоторые символы Юникода, кажется, вызывают проблемы из-за различных возможных способов их кодирования (как одна кодовая точка или комбинация кодовых точек). Пожалуйста, обратитесь к regular-expressions.info для получения дополнительной информации.
+1 за лучшее универсальное решение. Поскольку вы перечисляете несколько вариантов при отсутствии подробностей из OP, вы могли бы также показать и объяснить шаблоны, такие как[\P{L}]
Ray Toal
Также обратите внимание, что -символ должен быть первым или последним в списке, иначе его нужно экранировать.
kapex
[^\\p{L}\\p{Z}]похоже, также устраняет немецкие умляуты (ä, ö, ü) (по крайней мере, для меня: /), поэтому «регулярное выражение соответствует всему, что не является буквой на любом языке», похоже, не на 100% правильное
Питер
@Peter, он не исключает этих персонажей в моих тестах. В вашем случае может быть другая проблема, например, другая кодировка текста. Добавлю ссылку на дополнительную информацию.
Thomas
1
@Thomas String result = yourString.replaceAll("[^\w\s]","");делает ошибкуInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Шаблоны - это скомпилированные регулярные выражения. Во многих случаях, удобные методы , такие как String.matches, String.replaceAllи String.splitбудет предпочтительнее, но если вам нужно сделать много работы , с тем же регулярным выражением, это может быть более эффективным , чтобы скомпилировать его один раз и использовать его. Класс Pattern и его компаньон Matcher также предлагают больше функциональных возможностей, чем то небольшое количество, которое предоставляет String.
String
классу? В частности, ищите слово «регулярное выражение»; есть несколько методов, и немного подумав, вы подскажете, как действовать ... :)replaceAll
прочь. Если у вас есть более эзотерические требования, отредактируйте вопрос. :)replaceAll
для них, либо выполните синтаксический анализ строка, добавьте символы, которые не являются символами, которые вы хотите вывести, в другую строку, и в конце просто сделайте + = для строки, которую вы вернете.deleteChars.apply( fromString, "-+^.:," );
- найдите здесь deleteCharsОтветы:
Это зависит от того, что вы определяете как специальные символы, но попробуйте
replaceAll(...)
:String result = yourString.replaceAll("[-+.^:,]","");
Обратите внимание, что этот
^
символ не должен быть первым в списке, поскольку в этом случае вам придется либо экранировать его, либо он будет означать «любой, кроме этих символов».Еще одно примечание:
-
символ должен быть первым или последним в списке, иначе вам придется его экранировать, иначе он определит диапазон (например,:-,
будет означать «все символы в диапазоне:
до»,
).Итак, чтобы сохранить последовательность и не зависеть от позиционирования символов, вы можете захотеть экранировать все те символы, которые имеют особое значение в регулярных выражениях (следующий список не является полным, поэтому имейте в виду другие символы, такие как
(
,{
и$
т. Д.) :String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");
Если вы хотите избавиться от всех знаков препинания и символов, попробуйте это регулярное выражение:
\p{P}\p{S}
(имейте в виду, что в строках Java вам придется избегать обратных косых черт :)"\\p{P}\\p{S}"
.Третий способ может быть примерно таким, если вы можете точно определить, что следует оставить в вашей строке:
String result = yourString.replaceAll("[^\\w\\s]","");
Это означает: заменить все, что не является символом слова (в любом случае az, 0-9 или _) или пробелом.
Изменить: обратите внимание, что есть несколько других шаблонов, которые могут оказаться полезными. Однако я не могу объяснить их все, поэтому загляните в справочный раздел regular-expressions.info .
Вот менее строгая альтернатива подходу «определения разрешенных символов», предложенная Рэем:
String result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");
Регулярное выражение соответствует всему, что не является буквой на любом языке и не является разделителем (пробелы, перенос строки и т. Д.). Обратите внимание, что вы не можете использовать
[\P{L}\P{Z}]
(верхний регистр P означает отсутствие этого свойства), поскольку это будет означать «все, что не является буквой или не пробелом», что почти соответствует всему, поскольку буквы не являются пробелами и наоборот.Дополнительная информация о Unicode
Некоторые символы Юникода, кажется, вызывают проблемы из-за различных возможных способов их кодирования (как одна кодовая точка или комбинация кодовых точек). Пожалуйста, обратитесь к regular-expressions.info для получения дополнительной информации.
источник
[\P{L}]
-
символ должен быть первым или последним в списке, иначе его нужно экранировать.[^\\p{L}\\p{Z}]
похоже, также устраняет немецкие умляуты (ä, ö, ü) (по крайней мере, для меня: /), поэтому «регулярное выражение соответствует всему, что не является буквой на любом языке», похоже, не на 100% правильноеString result = yourString.replaceAll("[^\w\s]","");
делает ошибкуInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Это заменит все символы, кроме буквенно-цифровых.
replaceAll("[^A-Za-z0-9]","");
источник
Как описано здесь http://developer.android.com/reference/java/util/regex/Pattern.html
public class RegularExpressionTest { public static void main(String[] args) { System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()(")); System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^(")); } public static String getOnlyDigits(String s) { Pattern pattern = Pattern.compile("[^0-9]"); Matcher matcher = pattern.matcher(s); String number = matcher.replaceAll(""); return number; } public static String getOnlyStrings(String s) { Pattern pattern = Pattern.compile("[^a-z A-Z]"); Matcher matcher = pattern.matcher(s); String number = matcher.replaceAll(""); return number; } }
Результат
String is = one Number is = 9196390097
источник
Попробуйте
replaceAll()
метод своегоString
класса.Кстати, вот метод, тип возвращаемого значения и параметры.
public String replaceAll(String regex, String replacement)
Пример:
String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!"; str = str.replaceAll("[-+^]*", "");
Он должен удалить все символы {'^', '+', '-'}, которые вы хотели удалить!
источник
Чтобы удалить специальный символ
String t2 = "!@#$%^&*()-';,./?><+abdd"; t2 = t2.replaceAll("\\W+","");
Результат будет:
abdd.
Это прекрасно работает.
источник
Используйте
String.replaceAll()
метод на Java. replaceAll должно быть достаточно для вашей проблемы.источник
Вы можете удалить один символ следующим образом:
String str="+919595354336"; String result = str.replaceAll("\\\\+",""); System.out.println(result);
ВЫХОД:
919595354336
источник
Если вы просто хотите выполнить замену литерала в java, используйте,
Pattern.quote(string)
чтобы преобразовать любую строку в литерал.источник