Разделение строки не возвращает пустых результатов - PullRequest
8 голосов
/ 22 сентября 2010

Я пытаюсь использовать

"value1:value2::value3".split(":");

Проблема в том, что я хочу, чтобы он включал пустые результаты.

Возвращает: [value1, value2, value3]
Должно быть: [value1, value2, , value3]

Кто-нибудь знает регулярное выражение, чтобы это исправить?

Хорошо, я нашел причину проблемы.Я на самом деле читаю текстовый файл, и он содержит следующую строку:

123:;~\&:ST02:M:test:M:4540145::type;12:51253:D:2.2:567766::AL:::::::2.2b

Когда я обрабатываю эту строку, читая текстовый файл, он дает ошибочный результат, упомянутый выше, то есть он не содержит пустых результатов.в таких случаях: :::::.

Но когда я использую приведенную выше строку в тестовой программе, она не компилируется, и я получаю «недопустимую escape-последовательность».Я думаю, что это из-за "\ &".

Есть ли решение этой проблемы с помощью регулярного выражения?

Ответы [ 9 ]

19 голосов
/ 22 сентября 2010

split содержит пустые совпадения в результате, посмотрите документы здесь . Однако по умолчанию завершающие пустые строки (те, что находятся в конце массива) отбрасываются. Если вы хотите включить их, попробуйте split(":", -1).

4 голосов
/ 22 сентября 2010

У меня работает.

class t {
    public static void main(String[] _) {
        String t1 = "value1:value2::value3";
        String[] t2 = t1.split(":");
        System.out.println("t2 has "+t2.length+" elements");
        for (String tt : t2) System.out.println("\""+tt+"\"");
    }
}

дает вывод

$ java t
t2 has 4 elements
"value1"
"value2"
""
"value3"
2 голосов
/ 22 сентября 2010

Я думаю, что StringTokenizer может работать лучше для вас, YMMV.

1 голос
/ 22 сентября 2010

Использование Гуава х Сплиттер класс:

Iterable<String> split = Splitter.on(':').split("value1:value2::value3");

Splitter не пропускает пустые результаты по умолчанию, хотя вы можете сделать тот, который делает. Хотя из того, что говорят другие, видно, что то, что вы делаете, должно работать.

1 голос
/ 22 сентября 2010
public static void main(String[] args){
  String[] arr = "value1:value2::value3".split(":");
  for(String elm:arr){
    System.out.println("'"+elm+"',");
  }
  System.out.println(arr.length);
}

печать

'value1',
'value2',
'',
'value3',
4

Что именно то, что вы хотите. Ваша ошибка в другом месте ...

1 голос
/ 22 сентября 2010

Используйте отрицательный лимит в вашем отчете о разделении:

String str = "val1:val2::val3";
String[] st = str.split(":", -1);
for (int i = 0; i< st.length; i++)
    System.out.println(st[i]);

Результаты:

val1
val2

val3
1 голос
/ 22 сентября 2010

Честно говоря, я не вижу большой ничьи раскола. StringTokenizer работает так же хорошо для большинства подобных вещей и легко отсылает токены (так что вы можете сказать, что между ними ничего не было).

Хотелось бы, чтобы с улучшенным циклом он работал немного лучше, но, кроме того, не мешало бы попробовать.

Я думаю, что есть трюк с регулярным выражением, чтобы вернуть ваши совпавшие токены, но я провел 20 лет без изучения регулярного выражения, и это все еще никогда не было лучшим ответом на любую проблему, с которой я столкнулся знаю, так как я никогда не использую его, но решения без регулярных выражений, как правило, слишком легко победить.)

0 голосов
/ 04 октября 2013

Это работает,

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;

public class split {
public static void main(String[] args)
{
    String data = null;
    try {
    BufferedReader br = new BufferedReader(new FileReader(new File("split.csv")));
    while( (data=br.readLine())!=null)
    {
        System.out.println("line:"+data);
        String[] cols = data.split(":",-1);
        System.out.println("count:"+cols.length);
        for(int x=0;x<cols.length;++x)
        {
            System.out.println("["+x+"] =("+cols[x]+")");
        }
    }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Вот тестовый файл,

a:b:c:d:e
a:b:c:d:
a:b:c::
a:b::: 
a::::
::::
::::e
:::d:e
::c:d:e
:b:c:d:e
a:b:c:d:e
0 голосов
/ 22 сентября 2010

Это должно сработать, но сделайте StringTokenizer попытку, если у вас все еще есть проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...