Получить целое число из сложной строки

avatar
Ilan
8 апреля 2018 в 09:18
71
4
0

У меня есть код, который считывает содержимое определенного файла. Файл начинается так:

J-549 J-628 J-379 J-073 J-980 vs J-548 J-034 J-127 J-625 J-667\
J-152 J-681 J-922 J-079 J-103 vs J-409 J-552 J-253 J-286 J-711\
J-934 J-367 J-549 J-169 J-569 vs J-407 J-429 J-445 J-935 J-578\

Я хотел бы хранить каждое целое число в массиве размером 270 (количество строк) x 10 (целое число в каждой строке).

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

String strLine;
int[] id = new int[10];//list ID of each line
//Read File Line By Line
while ((strLine = br.readLine()) != null)   {
    // Print the content on the console

    strLine = strLine.replaceAll("J-", "");
    strLine = strLine.replaceAll(" vs ", " ");
    String[] teamString = strLine.split(" ");
    for(int i=0;i<id.length;i++) {
        System.out.print(id[i] + " ");
}

Я думал об удалении "J-" и "vs", но, похоже, это плохая идея. Консоль выводит :

549 628 379 073 980 548 034 127 625 667\ 
152 681 922 079 103 409 552 253 286 711\ 
934 367 549 169 569 407 429 445 935 578\ 

Кто-нибудь может помочь мне решить мою проблему. Спасибо!

Источник
Rehan Azher
8 апреля 2018 в 09:23
0

так что каждый ваш элемент массива будет иметь что: 549628379073980 548034127625667 или 549

Pshemo
8 апреля 2018 в 09:23
0

Каков ожидаемый результат? Вы спрашиваете, как также удалить \?

Kaushal28
8 апреля 2018 в 09:24
0

Нет, он просит альтернативу замены

Ilan
8 апреля 2018 в 09:25
0

Я хочу получить каждое целое число отдельно, и у меня проблема с символом '/'.

Ilan
8 апреля 2018 в 09:31
0

Я хотел бы использовать другое регулярное выражение, которое может разделить строку StrLine. Я хочу иметь массив, содержащий только идентификаторы игроков (целое число). Обратная реакция была проблемой, когда я пытался сохранить конец строки в целочисленном массиве. Печать, если для отладки (я хотел посмотреть, как была окончательная строка). Я забыл сказать, что мой последний массив должен быть целочисленного типа.

Ответы (4)

avatar
Roushan
8 апреля 2018 в 09:29
1

для замены\использования экранирующего символа\

String s[] ="J-549 J-628 J-379 J-073 J-980 vs J-548 J-034 J-127 J-625 J-667\\"
                    .replace("\\", "")
                    .replace("J-", "")
                    .replace(" vs ", " ")
                    .split(" ");
//System.out.println(s);
int[] id = new int[10];
for(int i=0; i<s.length; i++) {
    id[i] = Integer.valueOf(s[i]);
}
for(int i=0; i<id.length; i++) {
    System.out.println(id[i]);
}

Результат:

549
628
379
73
980
548
34
127
625
667
Pshemo
8 апреля 2018 в 09:45
1

Использование replaceAll имеет смысл только тогда, когда мы используем синтаксис регулярных выражений. Для литералов безопаснее использовать replace (он также заменяет все вхождения, несмотря на отсутствие суффикса All), чтобы избежать потенциальных проблем с синтаксисом регулярных выражений, например, когда мы хотели бы заменить +, *, (, [ и другие метасимволы регулярных выражений.

avatar
cbr
8 апреля 2018 в 09:42
6

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

Pattern idPattern = Pattern.compile("J-(\\d+)");
String strLine;
int[] id = new int[10]; // list ID of each line

// read file line by line
while ((strLine = br.readLine()) != null) {
    Matcher lineMatcher = idPattern.matcher(strLine);

    // find and parse every ID on this line
    for (int i = 0; matcher.find() && i < id.length; i++) {
        String idStr = matcher.group(1); // Gets the capture group 1 "(\\d+)" - group 0 is the entire match "J-(\\d+)"
        int id = Integer.parseInt(idStr, 10);
        id[i] = id;
        System.out.print(id + " ");
    }

    System.out.println();
}

Регулярное выражение J-(\d+) соответствует части строки, которая начинается с "J-" и заканчивается одним или несколькими числами. Круглые скобки вокруг числа создают группу захвата, к которой мы можем получить прямой доступ вместо замены "J-".

Если вы уверены, что хотите анализировать идентификаторы как целые числа, обратите внимание, что при анализе "073" становится 73. Не уверен, что это имеет значение для вас. Кроме того, если может содержать более 10 идентификаторов в одной строке, используйте ArrayList и добавьте туда идентификаторы, а не помещайте их в массив фиксированного размера.

Ilan
8 апреля 2018 в 09:58
0

Ваше решение интересно, но я уже нашел решение в другом посте. Спасибо :)

cbr
8 апреля 2018 в 10:08
0

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

avatar
Ash
8 апреля 2018 в 09:34
0

используйте strLine.replace("\\", ""); еще раз.

avatar
Shafin Mahmud
8 апреля 2018 в 09:31
1

Просто используйте регулярное выражение \d+, чтобы зафиксировать числовые термины и извлечь их все в список или массив, что хотите.

 Matcher m = Pattern.compile("\\d+").matcher(strLine);

 while (m.find()) {
    // print the number or store it in array or whatever
    System.out.println(m.group());
 }
Pshemo
8 апреля 2018 в 09:51
1

Нет необходимости заключать все регулярное выражение в круглые скобки. Кроме того, размещение необязательного \\.? в середине \\d* \\d+ может вызвать такие проблемы, как Катастрофический поиск с возвратом. Возможным улучшением в этом случае будет просто \\d+, если вы хотите включить необязательный .fraction что-то вроде \\d+(\\.\\d+)?.