Java-функция разделения строк, действующая странно - PullRequest
5 голосов
/ 11 января 2010

Я замечаю странное поведение при использовании метода split() в Java.

У меня есть следующая строка: 0|1|2|3|4|5|6|7|8|9|10

String currentString[] = br.readLine().split("\\|");
System.out.println("Length:"+currentString.length);
for(int i=0;i < currentString.length;i++){
     System.out.println(currentString[i]);
}

Это даст желаемый результат:

Length: 11
0
1
2
3
4
5
6
7
8
9
10

Однако, если я получу строку: 0|1|2|3|4|5|6|7|8||

Я получаю следующие результаты:

Length: 8
0
1
2
3
4
5
6
7
8

Последние 2 пустые опущены. Мне нужно, чтобы тары были сохранены. Не уверен, что я делаю не так. Я также попытался использовать разделение таким же образом. ... split("\\|",-1);

но это возвращает всю строку длиной 1.

Любая помощь будет принята с благодарностью!

Ответы [ 6 ]

5 голосов
/ 11 января 2010

Стандартное поведение split - не возвращать пустые токены (из-за нулевого предела). Использование метода разделения двух параметров с пределом -1 даст вам все пустые токены в ответе.

UPDATE:

Тестовый код следующим образом:

public class Test {
    public static void main(String[] args) {
    String currentString[] = "0|1|2|3|4|5|6|7|8||".split("\\|", -1);
    System.out.println("Length:"+currentString.length); 
    for(int i=0;i < currentString.length;i++){ System.out.println(currentString[i]); }
  }
}

Выводится следующим образом:

Length:11
0
1
2
3
4
5
6
7
8
--- BLANK LINE --    
--- BLANK LINE --

Я вставил "--- BLANK LINE -", чтобы показать, что возврат пуст. Пусто один раз для пустого токена после 8 | и один раз для пустого конечного токена после последнего |.

Надеюсь, это прояснит ситуацию.

4 голосов
/ 11 января 2010

String.split () странно.

Его чрезвычайная странность в этом и других отношениях является одной из причин, по которой мы сделали Splitter .

Он имеет менее удивительное поведение и большую гибкость.

1 голос
/ 11 января 2010

Моя Java немного ржавая, но не должна ли она быть:

String currentString[] = "0|1|2|3|4|5|6|7|8||".split("\\|");
System.out.println("Length:"+currentString.length); 
for(int i = 0; i < currentString.length; i++)
{
  System.out.println(currentString[i]); 
} 
0 голосов
/ 11 января 2010

Пожалуйста, проверьте следующий код, я использовал ваше решение, оно работает:


public class SplitTest 
{
    public static void main(String[] args)
    {
      String text = "0|1|2|3|4|5|6|7|8||";
      String pattern = "\\|";
      String [] array = text.split(pattern, -1);
          System.out.println("array length:" + array.length);
          for(int i=0; i&lt array.length; i++) 
          System.out.print(array[i]+ " ");
        } 
 }

вывод:

array length:11
0 1 2 3 4 5 6 7 8   
0 голосов
/ 11 января 2010

IMO, я думаю, что это стандартное поведение split, в любом случае, пожалуйста, попробуйте это:

String currentString [] = br.readLine (). Replace ("||", "| |"). Split ("\ |"); System.out.println ( "Длина:" + currentString.length); for (int i = 0; i

Это еще не было проверено, но я думаю, что это должно сработать.

0 голосов
/ 11 января 2010

Вам нужно использовать indexOf(), а затем substring(), чтобы это работало. Я не думаю, что вы можете очистить строку, используя только split().

...