Использование Java Regex для анализа строки, содержащей неизвестное количество совпадений, в список - PullRequest
0 голосов
/ 06 июня 2018

По сути, у меня есть строковое представление списка через запятую.Однако каждый отдельный элемент также разделяется запятой, поэтому строка была изменена, чтобы каждый элемент был окружен символами «<» и «>».Я пытаюсь использовать регулярные выражения для захвата каждого элемента и добавления его в список, что делает его списком элементов, а не строкой списка.

Вот несколько примеров входных данных строки:

"<>"         // should match regex, but will be thrown out
"<a=1>"
"<a=1,b=1>"
"<a=1,b=1>,<a=2,b=2>"
"<a=1,b=1>,<a=2,b=2>,<a=3,b=3,c=3>,<a=4>"

Соответствующие выходные данные, которые я хотел бы, были бы такими списками:

["a=1"]
["a=1,b=1"]
["a=1,b=1","a=2,b=2"]
["a=1,b=1","a=2,b=2","a=3,b=3,c=3","a=4"]

Шаблон, который я пытаюсь использовать:

Pattern pattern = Pattern.compile("<([^>]*)>(,<([^>]*)>)*");

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

Matcher matcher = pattern.matcher(myString);
if (matcher.matches()) {
    List<String> listOfElements = new ArrayList<>();
    for (int i = 1; i <= matcher.groupCount(); i++) { // group 0 represents the entire String, so start at index 1
        if (matcher.group(i) != null) {
            listOfElements.add(matcher.group(i));
        }
    }
    System.out.println(listOfElements);
}

В результате вышеприведенных тестов:

["a=1"]
["a=1,b=1"]
["a=1,b=1", ",<a=2,b=2>", "a=2,b=2"]
["a=1,b=1", ",<a=4>", "a=4"]

Примечание: я добавил к этому кавычкирезультат для читабельности, чтобы отделить значения в списке - очевидно, System.out.println () не записывает кавычки.

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете сделать это в одну строку, разделив с помощью осмотра:

String[] parts = str.split("(?<=>),(?=<)");

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

Если вам действительно нужен список:

List<String> parts = Arrays.asList(str.split("(?<=>),(?=<)"));
0 голосов
/ 06 июня 2018

Совпадение записей по одной с find вместо matches.

Pattern pattern = Pattern.compile("<([^>]*)>");
Matcher matcher = pattern.matcher(myString);
List<String> listOfElements = new ArrayList<>();

while (matcher.find()) {
    listOfElements.add(matcher.group(1));
}
System.out.println(listOfElements);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...