Я пытаюсь разобрать строку ввода типа "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))