Вы можете сделать все с 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*$
См. Демонстрационное выражение регулярных выражений
^\s*add\s+switch\s*
Соответствует началу команды строка, за которой следуют 0 или более пробелов, за которыми следует add
, за которыми следуют 1 или более пробелов, за которыми следуют switch
, за которыми следуют 0 или более пробелов. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\))
Координата: A (
, за которой следует 0 или более пробелы, за которыми следуют 1 или более цифр, за которыми следуют 0 или более пробелов, за которыми следует ,
, за которыми следуют 0 или более пробелов, за которыми следуют 1 или более цифр, за которыми следуют 0 или более пробелов, за которыми следует )
. \s*->\s*
Соответствует 0 или более пробелов, за которыми следует ->
, за которыми следуют 0 или более пробелов. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\))
Соответствует координате. \s*,\s*
Соответствует 0 или более пробелов, за которыми следует ,
, за которым следует 0 или более пробелов. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\))
Соответствует координате. \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