Мне нравится выполнять игру в коде в Java (хотя Java слишком многословен, чтобы быть конкурентоспособным), что решает определенную задачу в минимально возможном количестве байтов.В одном из моих ответов у меня был следующий фрагмент кода:
for(var p:"A4;B8;CU;EM;EW;E3;G6;G9;I1;L7;NZ;O0;R2;S5".split(";"))
, который в основном циклически перебирает 2-символьные строки после того, как мы преобразовали его в массив String с .split
.Кто-то предложил мне использовать это вместо этого, чтобы сэкономить 4 байта:
for(var p:"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G..)"))
Функциональность все та же.Он перебирает 2-символьные строки.
Однако никто из нас не был уверен на 100%, как это работает, отсюда и этот вопрос.
Что я знаю:
Я знаю, .split("(?<= ... )")
используется для разделения, но сохраняет конечный разделитель.
Существует также способ сохранить ведущий разделитель или разделитель как отдельный элемент:
"a;b;c;d".split("(?<=;)") // Results in ["a;", "b;", "c;", "d"]
"a;b;c;d".split("(?=;)") // Results in ["a", ";b", ";c", ";d"]
"a;b;c;d".split("((?<=;)|(?=;))") // Results in ["a", ";", "b", ";", "c", ";", "d"]
Я знаю, \G
используется для остановки после обнаружения несоответствия.
РЕДАКТИРОВАТЬ: \G
используется для указания позиции, где закончилось последнее совпадение (илиначало строки для первого запуска). Исправленное определение благодаря @SebastianProske.
int count = 0;
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("match,");
java.util.regex.Matcher matcher = pattern.matcher("match,match,match,blabla,match,match,");
while(matcher.find())
count++;
System.out.println(count); // Results in 5
count = 0;
pattern = java.util.regex.Pattern.compile("\\Gmatch,");
matcher = pattern.matcher("match,match,match,blabla,match,match,");
while(matcher.find())
count++;
System.out.println(count); // Results in 3
Но как именно .split("(?<=\\G..)")
работает точно при использовании \G
внутри разбиения?
А почему .split("(?=\\G..)")
не работает?
Здесь ссылка "Попробуйте онлайн" для всех описанных выше фрагментов кода, чтобы увидеть их в действии.