Як видалити спеціальні символи з рядка?


90

Я хочу видалити спеціальні символи, такі як:

- + ^ . : ,

із рядка за допомогою Java.


Ви, мабуть, уже знаєте, що таке регулярний вираз на основі того, як ви позначили своє запитання тегом. Спробували прочитати документацію до Stringкласу? Зокрема, шукайте слово "регулярний вираз"; Є кілька методів, і трохи роздумів має підказати вам, як діяти ... :)
Карл Кнехтель

3
Словосполучення "особливий персонаж" настільки зловживається, що майже повністю позбавлене сенсу. Якщо ви маєте на увазі: "У мене є цей список конкретних символів, яких я хочу видалити", тоді зробіть, як запропонував Томас, і сформуйте свій шаблон із класом символів регулярного виразу та replaceAllїх подалі. Якщо у вас є більше езотеричних вимог, відредагуйте питання. :)
Ray Toal

1
це не спеціальні символи ... це: äâêíìéè, оскільки вони не є вашими загальноприйнятими 1-байтовими типами символів, як - + ^ є ... у будь-якому випадку, як заявив Рей, або зробіть replaceAllдля них, або, проаналізуйте рядок, додайте символи, які не є символами, які ви хочете вивести, до іншого рядка, і в кінці просто зробіть + = до рядка, який ви повернете.
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );- знайдіть deleteChars тут
Каплан

Відповіді:


255

Це залежить від того, що ви визначаєте як спеціальні символи, але спробуйте 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

Здається, деякі символи Юнікоду створюють проблеми через різні можливі способи їх кодування (як окрема кодова точка або комбінація кодових точок). Для отримання додаткової інформації зверніться до регулярних висловлювань .


+1 за найкраще рішення загального призначення. Оскільки ви перелічуєте кілька варіантів за відсутності деталей з ОП, ви можете також показати та пояснити такі закономірності, як[\P{L}]
Ray Toal

Також зауважте, що -символ повинен бути першим або останнім у списку, або його потрібно екранувати.
kapex

[^\\p{L}\\p{Z}]здається, також усуває німецькі умлаути (ä, ö, ü) (принаймні, це робить для мене: /), тому "регулярний вираз відповідає всьому, що не є буквою будь-якої мови", здається, не на 100% правильне
Петро

@Peter це не виключає цих символів у моїх тестах. У вашому випадку може бути інша проблема, наприклад інше кодування тексту. Я додаю посилання на додаткову інформацію.
Томас

1
@Thomas String result = yourString.replaceAll("[^\w\s]","");робить помилкуInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

Як описано тут http://developer.android.com/reference/java/util/regex/Pattern.html

Шаблони складаються в регулярні вирази. У багатьох випадках такі зручні методи, як String.matches, String.replaceAllіString.split буде краще, але якщо вам потрібно зробити багато роботи , з тим же регулярним виразом, це може бути більш ефективним , щоб скомпілювати його один раз і використовувати його. Клас Pattern та його супутник, Matcher, також пропонують більше функціональних можливостей, ніж невелика кількість, яку виставляє String.

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

Це видалить арабські символи
S0haib Nasir

15

Спробуйте replaceAll()метод Stringзаняття.

До речі, тут є метод, тип повернення та параметри.

public String replaceAll(String regex,
                         String replacement)

Приклад:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

Він повинен видалити всі символи {'^', '+', '-'}, які ви хотіли видалити!


6

Видалити спеціальний символ

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

Результатом буде: abdd.

Це працює чудово.


1
отримає незаконний символ втечі в буквальному рядку
Джон Джо

Це також видалить пробіли, якщо ви хочете зберегти пробіли, а потім використовуйте t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Ісуру Ділшан,

2

Використовуйте String.replaceAll()метод у Java. replaceAll має бути достатньо хорошим для вирішення вашої проблеми.


1

Ви можете видалити одинарний символ наступним чином:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

ВИХІД:

919595354336

0

Якщо ви просто хочете зробити буквальну заміну в java, використовуйте Pattern.quote(string)для переходу будь-який рядок до літералу.

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