Java регулярное выражение получить все соответствующие группы - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь разобрать строку ввода типа "move 2 up;1 right;1 down" с помощью регулярного выражения, но я не могу понять, как получить все группы команд, игнорируя ключевое слово "move".

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

(?:\bmove\b) ((?<amount>[1-6]) (?<direction>(\bup\b|\bright\b|\bdown\b|\bleft\b))(?:;?))+

и мой код Java такой:

String str = "move 1 right;2 left;";
String regex = "(?:\\bmove\\b) ((?<amount>[1-6]) (?<direction>(\\bup\\b|\\bright\\b|\\bdown\\b|\\bleft\\b))(?:;?))+";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher match = pattern.matcher(str);
while (match.find()) {
    String group = match.group(1);
    System.out.println(group);
}

В цикле я хотел бы получить первую команду как "1 right", а вторую как "2 left". С регулярным выражением, которое у меня есть сейчас, я получаю только "2 left;". Вот несколько примеров ввода: https://regex101.com/r/Fg0hk3/3.

Как мне исправить мое регулярное выражение?


Завершено использованием двух шаблонов регулярных выражений, один для полного соответствия и один для токенов:

Полный матч:

(?:\bmove\b) ((?<amount>[1-6]) (?<direction>(\bup\b|\bright\b|\bdown\b|\bleft\b))(?:;?))+

Лексемы:

(?<amount>[1-6]) (?<direction>(?:\bup\b|\bright\b|\bdown\b|\bleft\b))

1 Ответ

0 голосов
/ 06 сентября 2018

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

String str = "move 55 up;2 right;100 down;8 left";
String regex = "(\\d+ (?:up|down|left|right))";
List<String> matches = new ArrayList<String>();
Matcher m = Pattern.compile(regex).matcher(str);

while (m.find()) {
    matches.add(m.group());
}

System.out.println(matches);
// Output: [55 up, 2 right, 100 down, 8 left]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...