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


Відповіді:


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, подивіться на ці питання:


коли я використовую цю функцію, вона також видаляє всі цифри. але я не хочу, щоб їх видаляли. просто хочу видалити спеціальні символи. Будь ласка, запропонуйте щось ...
Тану

ну ви сказали, що хочете лише алфавіт. Але я оновлю свою відповідь за хвилину
Шон Патрік Флойд

Я хочу конкатувати рядок, але з деякими умовами, як 1. Якщо є лише один результат, конкат не потрібен 2. Якщо результат більше 1, ніж рядок concat у наступному прикладі форми: стек + над + потік
Tanu

2
@Tanu, це інше питання. Зробіть його новим
Pekka

Що робити, якщо я не хочу видаляти пробіли? або скажімо, що всі пробіли, як вкладки, нові рядки згорнулися як лише один пробіл?
проклятий

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]", "");

5
Для використання в космосіreplaceAll("[^a-zA-Z0-9 ]", "");
Камар,

6

Замініть будь-які спеціальні символи на

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

приклад: замінити всю появу * на пробіли

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

* це твердження може одночасно замінювати лише один тип спеціальних символів


Безумовно, що я шукав, коли побачив заголовок запитання "Як замінити спеціальні символи в рядку?" Дякую!
Mr.Drew,

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.



-1
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();

Чи можете ви трохи пояснити регулярний вираз?
stdunbar

рекомендую додати примітки до розділу відповідей, щоб пояснити свій код. Будь ласка, прочитайте більше про те, як правильно писати відповіді .
Джо Ферндц,

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