Проблемы сплит-функции с пробелами

1

Я хочу выделить строку со специальными символами, например:

String s = ",?hello=glu()Stop/<><$#!gluglufazoperu";

Я использую функцию split для получения нормальных символов:

hello
glu
Stop
gluglufazoperu

У меня проблема, когда я использую split, который помещает пробел в начало массива строк, кто-нибудь знает, как его удалить?

Вот мой пример кода:

public class Main {
    public static void main(String[] args) {
        String s = ",?hello=glu()Stop/<><$#!gluglufazoperu";
        String f[] = s.split("[^\\w \\s]+");
        int i= 0;

        while(i < f.length){
            System.out.println(f[i]);
            i++;
        }
    }
}

Это результат: (пробел) hello glu Stop gluglufazoperu

  • 1
    Вы можете сначала заменить специальные символы одним пробелом, обрезать результат, а затем разделить. Однако вам все равно придется обрабатывать угловой случай пустой строки.
  • 0
    твой код работает нормально на моем конце
Показать ещё 2 комментария
Теги:
split

3 ответа

1
Лучший ответ

есть пробел, потому что первое разделение между ',' и '?' возвращает пустую строку "". С циклом while вы печатаете System.out.println(""), и это пустая строка.

Когда вы хотите распечатать непустые строки, вы должны заменить System.out.println на

if(!"".equals(f[i])){
System.out.println(f[i]);
}

И (рядом с вашим вопросом) небольшой совет, взгляните на этот учебник.

оракул для цикла

  • 0
    !"".equals(f[i]) можно заменить на !f[i].isEmpty()
  • 0
    верный! TNX для сложения. Я предпочитаю "" .equals, потому что тогда вы не можете получить нулевой указатель, но это только вопрос вкуса.
Показать ещё 2 комментария
0

Не пустое, а пустая строка как ",?" также является разделителем. Это может произойти и в конце.

Вы можете просто пропустить пустую строку. Вы можете удалить те из массива, что дорого, поскольку оно делает копию.

if (f.length > 1) {
    if (f[0].isEnpty()) {
        f = Arrays.copyOfRange(f, 1, f.length);
    }
    if (f.length > 1) {
        if (f[f.length - 1].isEnpty()) {
            f = Arrays.copyOfRange(f, 0, f.length - 1);
        }
    }
}

Примечания:

  • String[] f =... более обычна в java.
  • \\s уже фиксирует пространство, и вы действительно хотите сохранить пробелы?
0

Вы можете просто заменить самый длинный префикс строки, соответствующей вашему регулярному выражению, пустой строкой перед расщеплением:

final String regex = "[^\\w \\s]+";
String f[] = s.replaceAll("^"+regex, "")
              .split(regex);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню