Расщепление строк на основе разделителя - PullRequest
6 голосов
/ 18 декабря 2011

Я пытаюсь разбить очень простую коллекцию строк, которые имеют форму

0|0
10|15
30|55

и т. Д. По существу числа, разделенные трубами.

Когда я использую функцию разделения строки Java с .split ("|"). Я получаю несколько непредсказуемые результаты. пробел в первом слоте, иногда сам номер не там, где я думал.

Кто-нибудь может помочь и дать мне совет о том, как я могу использовать reg exp для хранения ТОЛЬКО целых чисел?

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

String temp = "0|0";
String splitString = temp.split("|");

Результаты

\n
0
| 
0

Я пытаюсь получить

0
0

только. Вечно благодарен за любую помощь заранее:)

Ответы [ 8 ]

7 голосов
/ 18 декабря 2011

Символ канала является специальным в регулярном выражении (он обозначает альтернативы), вам нужно его избежать. В зависимости от используемой вами версии Java это может объяснить ваши непредсказуемые результаты.

class t {
    public static void main(String[]_)
    {
        String temp = "0|0";
        String[] splitString = temp.split("\\|");

        for (int i=0; i<splitString.length; i++)
            System.out.println("splitString["+i+"] is " + splitString[i]);
    }       
}

выходы

splitString[0] is 0
splitString[1] is 0

Обратите внимание, что одна обратная косая черта является escape-символом регулярного выражения, но поскольку обратная косая черта также является escape-символом в исходном коде java, вам нужно два из них, чтобы вставить обратную косую черту в регулярное выражение.

7 голосов
/ 18 декабря 2011

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

String[] splited = yourString.split("[\\|\\s]+");

и регулярное выражение:

import java.util.regex.*;

Pattern pattern = Pattern.compile("\\d+(?=([\\|\\s\\r\\n]))");
Matcher matcher = pattern.matcher(yourString);
while (matcher.find()) {
    System.out.println(matcher.group());
}
4 голосов
/ 18 декабря 2011

Вы можете заменить пустое пространство для труб и разбить его.

String test = "0|0 10|15 30|55";
test = test.replace(" ", "|");
String[] result = test.split("|");

Надеюсь, это поможет вам ..

3 голосов
/ 18 декабря 2011

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

String test = "0|0";
StringTokenizer st = new StringTokenizer(test);
int firstNumber = Integer.parseInt(st.nextToken()); //will parse out the first number
int secondNumber = Integer.parseInt(st.nextToken()); //will parse out the second number

Конечно, вы всегда можете вложить это в цикл while, если у вас несколько строк.

Также вам необходимо импортировать java.util. * чтобы это работало.

2 голосов
/ 18 декабря 2011

Библиотека Guava имеет класс Splitter, который является гораздо более удобной альтернативой String.split(). Преимущества состоят в том, что вы можете разделить строку на определенные символы (например, '|'), или на конкретные строки, или с помощью регулярных выражений, и вы можете выбрать, что делать с результирующими частями (обрезать их, выбросить пустые части и т. Д. .).

Например, вы можете позвонить

Iterable<String> parts = Spliter.on('|').trimResults().omitEmptyStrings().split("0|0")
2 голосов
/ 18 декабря 2011

Трубка ('|') - это специальный символ в регулярных выражениях . Он должен быть «экранирован» с помощью символа «\», если вы хотите использовать его в качестве обычного символа, к сожалению, «\» - это специальный символ в Java, поэтому вам необходимо выполнить своего рода маневр с двойным экранированием, например,

String temp = "0|0";
String[] splitStrings = temp.split("\\|");
0 голосов
/ 28 апреля 2014

Рассматривая сценарий, в котором мы прочитали строку из файла csv или xls в виде строки и должны разделить столбцы в массиве строки в зависимости от разделителей.

Ниже приведен фрагмент кода для достиженияэта проблема ..

        
    { ...
    ....
    String line = new BufferedReader(new FileReader("your file"));
    String[] splittedString = StringSplitToArray(stringLine,"\"");
    ...
    ....
    }
    public static String[] StringSplitToArray(String stringToSplit, String delimiter) 
    {  
        StringBuffer token = new StringBuffer();
        Vector tokens = new Vector();
        char[] chars = stringToSplit.toCharArray();
        for (int i=0; i  0) {
               tokens.addElement(token.toString());
               token.setLength(0);
               i++;
         }
         } else {
                 token.append(chars[i]);
             }
         }
         if (token.length() > 0) {
             tokens.addElement(token.toString());
         }
         // convert the vector into an array
         String[] preparedArray = new String[tokens.size()];
         for (int i=0; i < preparedArray.length; i++) {
             preparedArray[i] = (String)tokens.elementAt(i);
         }
         return preparedArray;
    }

 

Приведенный выше фрагмент кода содержит вызов метода StringSplitToArray, где в методе преобразуется строка в массив строк, разделяющий строку в зависимости от указанного разделителя или переданного методу.Разделителем может быть разделитель запятой (,) или двойной код (").

Подробнее об этом см. По ссылке : http://scrapillars.blogspot.in

0 голосов
/ 18 декабря 2011

Это должно работать для вас:

([0-9]+)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...