Трещина , эффективно с Regex / Split () (?) - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время я работаю над пользовательским интерфейсом и уже реализовал команду add track <startpoint> -> <endpoint>.

Теперь я хочу реализовать команду add switch <startpoint> -> <endpoint1>,<endpoint2>.

Однако я не уверен, как эффективно разделить третий аргумент (<endpoint1>,<endpoint2>).

Вот как я это сделал с помощью команды add track:

        String startPointStr = InputPattern.parsePoint(args.get(0));
        String endPointStr = InputPattern.parsePoint(args.get(2));

        // TODO: Can I improve the code?
        String[] startCoords = startPointStr.substring(1, startPointStr.length() - 1).split(",");
        Point startPoint = new Point(Integer.parseInt(startCoords[0]), Integer.parseInt(startCoords[1]));

        String[] endCoords = endPointStr.substring(1, endPointStr.length() - 1).split(",");
        Point endPoint = new Point(Integer.parseInt(endCoords[0]), Integer.parseInt(endCoords[1]));

Кстати: точка = (<x-coordinate>,<y-coordinate>). Метод parsePoint проверяет шаблон на «\ (\ d +, \ d + \)» с помощью регулярных выражений.

Поэтому я хочу создать еще одну точку Point secondEndPoint = new Point(...); для конечной точки2. Как я мог это сделать (регулярное выражение, .split (), ...,?).

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете сделать все с split, как вы это делаете. Но если вы хотите быть более гибкими в отношении того, что вы разрешаете вводить, вы можете позволить пользователю использовать или , а не использовать пробелы более свободно. Например, пользователю может быть разрешено ввести координату как (123, 456). Или может не быть необходимости иметь пробелы по обе стороны от оператора ->. В этом случае можно использовать одно регулярное выражение для распознавания полной команды:

^\s*add\s+switch\s*(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))\s*->\s*(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))\s*,\s*(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))\s*$

См. Демонстрационное выражение регулярных выражений

  1. ^\s*add\s+switch\s* Соответствует началу команды строка, за которой следуют 0 или более пробелов, за которыми следует add, за которыми следуют 1 или более пробелов, за которыми следуют switch, за которыми следуют 0 или более пробелов.
  2. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\)) Координата: A (, за которой следует 0 или более пробелы, за которыми следуют 1 или более цифр, за которыми следуют 0 или более пробелов, за которыми следует ,, за которыми следуют 0 или более пробелов, за которыми следуют 1 или более цифр, за которыми следуют 0 или более пробелов, за которыми следует ).
  3. \s*->\s* Соответствует 0 или более пробелов, за которыми следует ->, за которыми следуют 0 или более пробелов.
  4. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\)) Соответствует координате.
  5. \s*,\s* Соответствует 0 или более пробелов, за которыми следует ,, за которым следует 0 или более пробелов.
  6. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\)) Соответствует координате.
  7. \s*$ Соответствует 0 или более пробелов, за которыми следует конец строки.

Первая координата будет в группах захвата 1 и 2, вторая координата i n групп захвата 3 и 4 и третья координата в группах захвата 5 и 6.

Пример кода:

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

public class Test
{
    public static void main(String[] args) {
        String tests[] = {
            "add switch(123,456)->(45,67),(8,100)",
            "  add switch (19 , 310) -> (21 , 890) , (1 ,  2)  "
        };
        for (String test: tests) {
            Pattern pattern = Pattern.compile("^\\s*add\\s+switch\\s*(?:\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))\\s*->\\s*(?:\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))\\s*,\\s*(?:\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))\\s*$");
            Matcher m = pattern.matcher(test);
            if (m.find()) {
                for (int i = 0; i <= 6; ++i) {
                    System.out.println("Group " + i + " = " + m.group(i));
                }
                System.out.println();
            }
        }
    }
}

Печать:

Group 0 = add switch(123,456)->(45,67),(8,100)
Group 1 = 123
Group 2 = 456
Group 3 = 45
Group 4 = 67
Group 5 = 8
Group 6 = 100

Group 0 =   add switch (19 , 310) -> (21 , 890) , (1 ,  2)
Group 1 = 19
Group 2 = 310
Group 3 = 21
Group 4 = 890
Group 5 = 1
Group 6 = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...