Удаление определенных символов из строки
Я думаю об использовании String.replaceAll()
для удаления определенных символов в моей строке. Непонятно, какие символы будут удалены (т.е. Какие символы я хочу удалить), но я бы предположил, что любой символ действителен (например, [a-zA-Z]
и такие вещи, как $%!
и т.д.).
Я наткнулся на http://www.java-tips.org/java-se-tips/java.lang/strip-certain-characters-from-a-string.html, но, безусловно, есть лучший способ, чем повторение каждого символа...
Любые мысли об этом?
Спасибо
Пример:
Чтобы уточнить, у меня будут строки различной длины. Я хочу удалить из него символы, которые будут определены во время выполнения, и вернуть результирующую строку.
Взяв вышеприведенный абзац и разрешив снять ",.
", я бы вернул строку:
Просто, чтобы уточнить, у меня будут строки меняя длину символы от него точные определяться во время выполнения и возвращаться результирующая строка
В стороне, я знаю, что replaceAll() использует регулярные выражения, поэтому, если бы я хотел вычеркнуть символы "$.", мне тоже нужно было бы их избежать?
Ответы
Ответ 1
Я думаю, ниже код поможет вам.
String input = "Just to clarify, I will have strings of varying "
+ "lengths. I want to strip characters from it, the exact "
+ "ones to be determined at runtime, and return the "
+ "resulting string.";
String regx = ",.";
char[] ca = regx.toCharArray();
for (char c : ca) {
input = input.replace(""+c, "");
}
System.out.println(input);
Ответ 2
Возможно, вам захочется начать с указания того, какой символ вы хотите сохранить, попробуйте что-то вроде:
"mystring".replaceAll("[^a-zA-Z]", "")
Чтобы сохранить только буквы.
Ответ 3
Это один из тех случаев, когда регулярные выражения, вероятно, не очень хорошая идея. Вы собираетесь написать более специальный код, чтобы обойти регулярное выражение, чем если бы вы просто использовали простой подход и перебирали символы. Вы также можете игнорировать некоторые случаи, которые могут появиться как ошибка позже.
Если вы обеспокоены производительностью, регулярное выражение на самом деле будет намного медленнее. Если вы просматриваете код или профиль, используя его, regex должен создать шаблон для синтаксического анализа/компиляции, выполнения логики соответствия и последующего применения вашей замены. Все это создает много объектов, которые могут быть дорогими, если вы часто повторяете это достаточно.
Я бы реализовал то, что вы нашли на этой ссылке несколько иначе. Вы можете сэкономить на ненужных выделениях String
, поскольку он создает результат без какой-либо дополнительной сложности:
public static String stripChars(String input, String strip) {
StringBuilder result = new StringBuilder();
for (char c : input.toCharArray()) {
if (strip.indexOf(c) == -1) {
result.append(c);
}
}
return result.toString();
}
Ответ 4
Если вы уже используете библиотеку, Guava легко справляется с CharMatcher
String charsToRemove = "%^#";
String stringToFilter = "I have 20% of my assets in #2 pencils! :^)";
String filtered = CharMatcher.anyOf(charsToRemove).removeFrom(stringToFilter);
Ответ 5
Я думаю, что вы ищете такой код, чтобы решить вашу проблему without any looping
:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StripChars {
public static void main(String[] args) {
// prints: Just to clarify I will have strings of varying lengths
System.out.println(
replace("Just to clarify, I will have strings of varying lengths.",
",."));
// prints: Solution to my problem on Stackoverflow will cost me 0
System.out.println(
replace("Solution to my problem on stackoverflow will cost me $0.",
".$"));
}
static String replace(String line, String charsToBeReplaced) {
Pattern p = Pattern.compile("(.{1})");
Matcher m = p.matcher(charsToBeReplaced);
return line.replaceAll(m.replaceAll("\\\\$1\\|"), "");
}
}
Чтобы позаботиться о специальных символах регулярного выражения (метасимволы) в методе замещения ввода, сначала помещаем\(обратная косая черта) перед каждым символом и | (труба) после каждого символа на вашем входе. Таким образом, ввод ",."
станет "\\,|\\.|"
Как только это будет сделано, замена будет довольно простой: для каждого соответствия char замените его пробелом.
Не используется в этом решении, но вот шаблон для обнаружения наличия специального символа регулярного выражения ЛЮБОЙ в Java:
Pattern metachars = Pattern.compile(
"^.*?(\\(|\\[|\\{|\\^|\\-|\\$|\\||\\]|\\}|\\)|\\?|\\*|\\+|\\.).*?$");
Ответ 6
Метод Guava интересен, хотя я не уверен, почему они используют переменную "spread". Поскольку они используют это, для каждой смены требуется операция вычитания. Я сравнивал несколько версий (включая простой ручной кодированный сдвиг), и вы можете найти запись здесь:
http://thushw.blogspot.com/2013/06/java-remove-specified-characters-from.html
Ответ 7
Я думаю, что это можно сделать, используя регулярные выражения.
Во-первых, мы знаем, что [a-zA-Z]
и $%!
допустимы для символов в строке. Поэтому мы используем regx "[^a-zA-Z0-9$%!]"
для выделения других недопустимых символов.
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html для подробной информации о JAVA patten.
Далее мы можем использовать mystring.replaceAll(String regex, String replacement)
P.S. RefexPlanet онлайн Страница проверки регулярных выражений
Ответ 8
Я думаю, что код примера на вашей ссылке достаточно хорош, и вы можете добавить другие допустимые символы по вашему выбору. Но вы можете свести к минимуму код, используя регулярное выражение. Взгляните на код Абдуллы или посмотрите link1, link2, link3.