Split String зависит от символов в Java - PullRequest
4 голосов
/ 24 апреля 2019

Дана следующая строка (одна строка):

a_Type_of_Data 0.847481:611x569+446+1200,0.515323:597x762+448+1101,0.587354:597x558+488+1207

Я бы хотел разделить его следующим образом [611, 559, 446, 1200], [597, 762, 448, 1101], [597, 558, 488, 1207]. Таким образом, в основном, чтобы получить 4 числа между каждым ":" и "," независимо от символов между числами.

Я уже пытался разбить строку на ",", но у меня все еще есть проблема с числом перед ":". Или все идет вместе, как при использовании string result = Regex.Replace(input, @"[^\d]", "");

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

Ответы [ 3 ]

1 голос
/ 24 апреля 2019

Вы можете сначала использовать это регулярное выражение \d+x\d+(?:\+\d+){2}, чтобы сопоставить эти числа, разделенные x и +, а затем разделить эти отдельные строки, используя [x+], что даст вам другой массив чисел.

Проверьте этот код Java,

String s = "a_Type_of_Data 0.847481:611x569+446+1200,0.515323:597x762+448+1101,0.587354:597x558+488+1207";
Pattern p = Pattern.compile("\\d+x\\d+(?:\\+\\d+){2}");
List<List<String>> list = new ArrayList<>();

Matcher m = p.matcher(s);
while(m.find()) {
    String[] data = m.group().split("[x+]");
    list.add(Arrays.asList(data));
}
list.forEach(System.out::print);

Печатает вывод, как вы ожидали,

[611, 569, 446, 1200][597, 762, 448, 1101][597, 558, 488, 1207]
0 голосов
/ 24 апреля 2019
String input = "a_Type_of_Data 0.847481:611x569+446+1200,0.515323:597x762+448+1101,0.587354:597x558+488+1207";

List<List<String>> result = Arrays.stream(input.split(","))        // split input at ','
       .map(e->e.split(":")[1])                                    // split each part at ':' and keep the second part
       .map(e->Pattern.compile("[+x]").splitAsStream(e).collect(Collectors.toList()))    // split at '+' or 'x' & collect to list 
       .collect(Collectors.toList());                            // collect to list 
System.out.println(result);
0 голосов
/ 24 апреля 2019

Используйте Matcher и его метод .find ():

package so21090424;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternFinder {

    public static void main(String[] args) {
        final String input = "a_Type_of_Data 0.847481:611x569+446+1200,0.515323:597x762+448+1101,0.587354:597x558+488+1207";
        Pattern p = Pattern.compile(":([0-9]+)[x\\+]([0-9]+)[x\\+]([0-9]+)[x\\+]([0-9]+),?");
        Matcher m = p.matcher(input);
        while(m.find()) {
            System.out.println(m.group(1) + "\t" + m.group(2) + "\t" + m.group(3) + "\t" + m.group(4));
        }
    }

}

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