Удаление до 4 пробелов из строки - PullRequest
1 голос
/ 08 июля 2010

У меня есть массив строк, через которые я зацикливаюсь.Для каждой строки мне нужно удалить до 4 пробелов с начала.Другими словами, если есть только 2 пробела, я удаляю 2. Если есть 6 пробелов, я удаляю 4. Как мне указать это в цикле?

for(int i=0; i<stringArray.length; i++) {
    newString = REMOVE UP TO 4 SPACES FROM stringArray[i];
    stringArray[i] = newString;
}

Спасибо!

Ответы [ 3 ]

3 голосов
/ 08 июля 2010

Попробуйте это:

stringArray[i] = stringArray[i].replaceFirst ("^ {0,4}", "");
1 голос
/ 08 июля 2010

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 символов пробела, если возможно, больше

Затем мы заменяем первое вхождение такого совпадения пустой строкой, по существу удаляя его.


Дополнительные учебные ресурсы

Это было знакомство новичка с основами регулярных выражений. В этом удивительном мире еще много аспектов, которые еще не исследованы.

Ссылки

Смежные вопросы

  • Скоро будет
1 голос
/ 08 июля 2010

Вас интересуют конечные пробелы?

Вы можете проверить его по регулярному выражению, чтобы увидеть, соответствует ли оно 4 или более пробелам впереди, и использовать подстроку для отсечения первых 4 пробелов. Иначе, если впереди меньше 4 пробелов (не соответствует RegEx), просто используйте string.trim () в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...