У мене є рядок з безліччю спеціальних символів. Я хочу видалити всі ці, але зберегти алфавітні символи.
Як я можу це зробити?
Відповіді:
Це залежить від того, що ви маєте на увазі. Якщо ви просто хочете від них позбутися, зробіть наступне :
(Оновлення: мабуть, ви також хочете зберегти цифри, використовуйте в цьому випадку другі рядки)
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, подивіться на ці питання:
Я цим користуюся.
s = s.replaceAll("\\W", "");
Він замінює всі спеціальні символи з рядка.
Ось
\ w: Символ слова, скорочення від [a-zA-Z_0-9]
\ W: Несловний символ
Ви можете використовувати наступний спосіб, щоб зберегти буквено-цифрові символи.
replaceAll("[^a-zA-Z0-9]", "");
І якщо ви хочете зберегти лише алфавітні символи, використовуйте це
replaceAll("[^a-zA-Z]", "");
replaceAll("[^a-zA-Z0-9 ]", "");
Замініть будь-які спеціальні символи на
replaceAll("\\your special character","new character");
приклад: замінити всю появу * на пробіли
replaceAll("\\*","");
* це твердження може одночасно замінювати лише один тип спеціальних символів
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");
Тут замінюються всі спеціальні символи, крім пробілу, коми та амперсанда. Ви також можете опустити пробіл, кому та амперсанд за допомогою наступного регулярного виразу.
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");
Де Input - це рядок, який нам потрібно замінити символами.
На прикладі відповіді Анджея Дойла , я думаю, найкращим рішенням є використання 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;
}
}
Ви можете використовувати основні регулярні вирази для рядків, щоб знайти всі спеціальні символи, або використовувати шаблони та класи збігів для пошуку / модифікації / видалення визначених користувачем рядків. Це посилання містить кілька простих і зрозумілих прикладів для регулярних виразів: http://www.vogella.de/articles/JavaRegularExpressions/article.html
Ви можете отримати Unicode для цього сміттєвого символу за допомогою інструмента створення карт символів у вікні ПК та додати \ u, наприклад \ u00a9 для символу авторських прав. Тепер ви можете використовувати цей рядок із цим конкретним символом сміття, не видаляти жодного сміттєвого символу, а замінювати його належним Unicode.
Для пробілів використовуйте "[^ az AZ 0-9]" цей шаблон
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();