Regex - лучший инструмент для этой работы. Я объясню это шаг за шагом:
Введение
System.out.println(
"# one ## two ### three #### four"
.replaceAll("##", "@@")
);
// "# one @@ two @@# three @@@@ four"
Приведенный выше фрагмент должен дать вам хорошее представление о том, как работает replaceAll
: он заменяет все вхождения "##"
на "@@"
.
шаблон
Как оказалось, replaceAll
- это метод на основе регулярных выражений: первый аргумент - это специальная строка pattern , а второй аргумент - это специальная replace строка. Следующий фрагмент иллюстрирует идею:
System.out.println(
"# one ## two ### three #### four"
.replaceAll("#{2}", "@@")
);
// "# one @@ two @@# three @@@@ four"
Теперь мы использовали "#{2}"
в качестве первого аргумента. Скорее интуитивно, в регулярном выражении это означает «#
повторяется ровно дважды»; это точно такой же шаблон, как и раньше, поэтому мы также получаем тот же результат.
Диапазон
Синтаксис ограниченного повторения в регулярном выражении на самом деле довольно выразителен: вместо точного повторения мы также можем определить диапазон следующим образом:
System.out.println(
"# one ## two ### three #### four"
.replaceAll("#{1,3}", ":")
);
// ": one : two : three :: four"
Скорее, интуитивно, #{1,3}
означает «#
повторяется от 1 до 3 раз».
Жадность
Теперь обратите внимание, что по умолчанию повторение регулярных выражений жадный : он пытается соответствовать больше, если это возможно. Это иллюстрируется следующим:
System.out.println(
"# one ## two ### three #### four"
.replaceAll("#{2,3}", ":")
);
// ": one : two : three :# four"
Обратите внимание, что ####
заменяется на :#
. Это потому, что первые 3 были взяты первой заменой, оставив только 1 осталось. Если бы #{2,3}
взяли только 2 #
в первый раз, было бы еще #
во второй раз, но так как жадный , потребовалось 3 #
в первый раз, оставив его нет шансов взять последний #
!
Первый
Теперь давайте попробуем еще один пример:
System.out.println(
"=====5====4===3==2=1"
.replaceAll("={1,4}", ":")
);
// "::5:4:3:2:1"
Теперь предположим, что мы хотим заменить только первое совпадение ={1,4}
на ":"
.
System.out.println(
"=====5====4===3==2=1"
.replaceFirst("={1,4}", ":")
);
// ":=5====4===3==2=1"
Вуаля! Все работает как положено!
Якорь
Теперь давайте посмотрим на следующий пример:
System.out.println(
"0=====5====4===3==2=1"
.replaceFirst("={1,4}", ":")
);
// "0:=5====4===3==2=1"
Замена все еще делает то, что должна, но давайте предположим, что мы сопоставляем только ={1,4}
в начале строки. К счастью для нас, регулярное выражение имеет способ выразить это: мы можем привязать шаблон в начале строки, который обозначается ^
.
System.out.println(
"0=====5====4===3==2=1"
.replaceFirst("^={1,4}", ":")
);
// "0=====5====4===3==2=1"
System.out.println(
"=====5====4===3==2=1"
.replaceFirst("^={1,4}", ":")
);
// ":=5====4===3==2=1"
System.out.println(
"===3==2=1"
.replaceFirst("^={1,4}", ":")
);
// ":3==2=1"
Вуаля! Все работает как положено!
Возвращаясь к ответу
А теперь у нас достаточно информации, чтобы ответить на оригинальный вопрос!
stringArray[i] = stringArray[i].replaceFirst("^ {1,4}", "");
Таким образом, шаблон ^ {1,4}
означает:
- Якорь в начале строки с
^
...
- ... от 1 до 4 символов пробела, если возможно, больше
Затем мы заменяем первое вхождение такого совпадения пустой строкой, по существу удаляя его.
Дополнительные учебные ресурсы
Это было знакомство новичка с основами регулярных выражений. В этом удивительном мире еще много аспектов, которые еще не исследованы.
Ссылки
Смежные вопросы