Разделение слов на буквы в Java

Как разбить слово на составляющие его буквы?

Пример кода, который не работает

 class Test {
         public static void main( String[] args) {
             String[] result = "Stack Me 123 Heppa1 oeu".split("\\a");                                                                                   

             // output should be
             // S
             // t
             // a
             // c
             // k
             // M
             // e
             // H
             // e
             // ...
             for ( int x=0; x<result.length; x++) {
                 System.out.println(result[x] + "\n");
             }
         }
     }

Проблема, похоже, в персонаже \\a. Это должно быть [A-Za-z].


person Léo Léopold Hertz 준영    schedule 05.10.2009    source источник
comment
В вашем примере не ясно, хотите ли вы, чтобы 123 были разделены или нет.   -  person patros    schedule 05.10.2009
comment
Патрос: Я не хочу, чтобы 123 разделялись.   -  person Léo Léopold Hertz 준영    schedule 05.10.2009


Ответы (6)


Вам нужно использовать split("");.

Это разделит его на каждый символ.

Однако я думаю, что было бы лучше перебирать символы String следующим образом:

for (int i = 0;i < str.length(); i++){
    System.out.println(str.charAt(i));
}

Нет необходимости создавать еще одну копию вашего String в другой форме.

person jjnguy    schedule 05.10.2009
comment
+1: Хм, я не думал о создании еще одной копии строки. Хорошая точка зрения. - person Powerlord; 05.10.2009
comment
Здесь следует учитывать одну вещь: str.charAt(i) вернет char. Поэтому, если вам нужна строка, вам нужно будет сделать Character.toString(str.charAt(i)). Это создаст копию этого символа, но это все же лучше, чем пространство O(n), которое даст вам использование str.split(). - person catalyst294; 09.02.2014
comment
это решение даст массив длины 1, если ввод является пустой строкой - person rightful; 26.07.2020
comment
Последний комментарий верен: пустая строка - это единственный случай, когда .split("") добавит лишний (пустой) элемент в массив. - person Rautermann; 23.05.2021

Включая числа, но не пробелы:

"Stack Me 123 Heppa1 oeu".replaceAll("\\W","").toCharArray();

=> S, t, a, c, k, M, e, 1, 2, 3, H, e, p, p, a, 1, o, e, u

Без цифр и пробелов:

"Stack Me 123 Heppa1 oeu".replaceAll("[^a-z^A-Z]","").toCharArray()

=> S, t, a, c, k, M, e, H, e, p, p, a, o, e, u

person p3t0r    schedule 05.10.2009

Вы можете использовать

String [] strArr = Str.split("");
person Community    schedule 07.12.2015
comment
Это добавляет дополнительную пустую строку в позицию 0, поэтому массив становится одним дополнительным. - person JPM; 23.05.2016

Я почти уверен, что он не хочет, чтобы пробелы выводились.

for (char c: s.toCharArray()) {
    if (isAlpha(c)) {
       System.out.println(c);
     }
}
person Gandalf    schedule 05.10.2009

person    schedule
comment
+1: Простой, лаконичный, и его можно легко накормить. - person Powerlord; 05.10.2009
comment
Создание дополнительного массива символов — это дополнительный шаг, в котором нет необходимости. - person jjnguy; 05.10.2009
comment
Зависит от. Я предполагаю, что выше определенной длины arrayCopy и прямой доступ к массиву быстрее, чем вызов сотен charAt. - person Zed; 05.10.2009
comment
Вызов charAt — это O(1), потому что String реализован с использованием массива в бэкенде. Создание копии всегда будет медленнее. - person jjnguy; 05.10.2009
comment
Вызов charAt(i) реализован, чтобы сначала выполнить проверку работоспособности входного параметра, а затем сместить его с внутренним смещением, и после этого да, это доступ к массиву. - person Zed; 05.10.2009

person    schedule
comment
Ваш код выдает ошибку ниже при выполнении. Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 **(?<=\G.{1})** ^ at java.util.regex.Pattern.error(Pattern.java:1924) at java.util.regex.Pattern.sequence(Pattern.java:2090) at java.util.regex.Pattern.expr(Pattern.java:1964) at java.util.regex.Pattern.compile(Pattern.java:1665) at java.util.regex.Pattern.<init>(Pattern.java:1337) at java.util.regex.Pattern.compile(Pattern.java:1022) at java.lang.String.split(String.java:2313) at java.lang.String.split(String.java:2355) - person mannedear; 03.11.2017