Regex или Split для получения данных в Java - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий тип данных (через пробел):

  • String1 String2 12 348 51 34 567
  • StringAlone 12 348 51 34 567
  • ManyString ManyString1 ManyString2 12 348 51 34 567

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

Я пытался использовать split и regex в java, однако мне не удалось его взломать.

Matcher matcher = Pattern.compile("\\w+.").matcher(string);

Выше возвращается только первая строка.

Matcher matcher1 = Pattern.compile("\\d+.").matcher(string);

Этот возвращает только первое число.

String str = data.text().split("[0-9]")[0];

Этот возвращает мне текстовые строки, однако я не уверен, как получить числа.

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

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вместо того, чтобы пытаться делать все с помощью одного регулярного выражения, я бы разбил его на две операции.Сначала сопоставьте пять значений в правой части.Затем вы можете найти индекс этой подстроки, чтобы найти, где заканчиваются нужные данные String.Что-то вроде

String[] arr = { "String1 String2 12 348 51 34 567", "StringAlone 12 348 51 34 567",
        "ManyString ManyString1 ManyString2 12 348 51 34 567" };
Pattern right = Pattern.compile("(\\d+ \\d+ \\d+ \\d+ \\d+)$");
for (String data : arr) {
    Matcher m = right.matcher(data);
    if (m.find()) {
        String token = m.group();
        String str = data.substring(0, data.indexOf(token) - 1);
        System.out.println(str);
        int[] numbers = Arrays.stream(token.split(" "))
                .mapToInt(Integer::parseInt).toArray();
        System.out.println(Arrays.toString(numbers));
    }
}

Я получаю

String1 String2
[12, 348, 51, 34, 567]
StringAlone
[12, 348, 51, 34, 567]
ManyString ManyString1 ManyString2
[12, 348, 51, 34, 567]
0 голосов
/ 05 октября 2018

Вы можете использовать метод find(), чтобы продолжать цикл, пока еще есть совпадение в String:

while(matcher.find()) {
    System.out.println(matcher.group());
}

Вот пример помещения результатов вArrayList:

String string = "String1 String2 12 348 51 34 567";
ArrayList<String> strArr = new ArrayList<>();
ArrayList<Integer> numArr = new ArrayList<>();
Matcher matcher = Pattern.compile("\\w+.").matcher(string);
while(matcher.find()) {
    strArr.add(matcher.group());
}
Matcher matcher2 = Pattern.compile("\\d+").matcher(string);
while(matcher.find()) {
    numArr.add(Integer.parseInt(matcher.group().trim()));
}
strArr.stream().forEach(System.out::println);
numArr.stream().forEach(System.out::println);

С выходом (для String "String1 String2 12 348 51 34 567")

String1 
String2 
12 
348 
51 
34 
567
...