Удалите все несимвольные символы из массива String в java

Я пытаюсь написать метод, который удаляет все неалфавитные символы из Java String[], а затем преобразует строку в строчную строку. Я попытался использовать регулярное выражение, чтобы заменить появление всех неалфавитных символов на "". Однако результат, который я получаю, не в состоянии сделать это. Вот код

static String[] inputValidator(String[] line) {
        for ( int i = 0; i < line.length; i++) {
                        line[i].replaceAll("[^a-zA-Z]", "");
                        line[i].toLowerCase();
        }
        return line;
    }

Однако, если я попытаюсь предоставить вход, который не имеет алфавитов (например, - или .), вывод также состоит из них, поскольку они не удаляются.

Пример ввода

A dog is an animal. Animals are not people.

Результат, который я получаю

A
dog
is
an
animal.
Animals
are
not
people.

Ожидаемый результат

a
dog
is
an
animal
animals
are
not
people

Ответы

Ответ 1

Проблема заключается в том, что ваши изменения не сохраняются, потому что строки immutable. Каждый вызов возвращает новый String, представляющий изменение, при этом текущий String остается неизменным. Вам просто нужно сохранить возвращенный String обратно в массив.

line[i] = line[i].replaceAll("[^a-zA-Z]", "");
line[i] = line[i].toLowerCase();

Поскольку каждый метод возвращает String, вы можете объединить вызовы методов. Это выполнит второй вызов метода на результат первого, что позволит вам выполнять оба действия в одной строке.

line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();

Ответ 2

Вам нужно назначить результат вашего регулярного выражения на строки [i].

for ( int i = 0; i < line.length; i++) {
  line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
}

Ответ 3

Это не работает, потому что строки неизменяемы, вам нужно установить значение например.

line[i] = line[i].toLowerCase(); 

Ответ 4

Вы должны переназначить результат toLowerCase() и replaceAll() на line[i], так как Java String является неизменяемым (его внутреннее значение никогда не изменяется, а методы в классе String возвращают новый String > вместо изменения объекта String).

Ответ 5

Классный (но немного громоздкий, если вам не нравится кастинг) способ делать то, что вы хотите сделать, - пройти через всю строку, индексировать по индексу, отбрасывая каждый результат из String.charAt(index) в (byte), а затем проверяя, является ли этот байт либо а) в числовом диапазоне строчных буквенных символов (a = 97 до z = 122), и в этом случае верните его обратно в char и добавьте его в строку, array или what-have-you или b) в числовом диапазоне букв верхнего регистра (A = 65 до Z = 90), и в этом случае добавьте 32 (A + 22 = 65 + 32 = 97 = a ) и добавьте его в char и добавьте его. Если он не находится ни в одном из этих диапазонов, просто отбросьте его.

Ответ 6

Как он уже ответил, просто подумал о том, чтобы поделиться еще одним способом, который здесь не упоминался.

 str = str.replaceAll("\\P{Alnum}", "").toLowerCase();