Автор оригинала: Attila Fejér.
Удалить ведущие и трейинг символы из строки
1. Введение
В этом коротком учебнике мы увидим несколько способов удаления ведущих и задних символов из Струнные . Для простоты мы удалим нули в примерах.
С каждой реализацией мы создадим два метода: один для ведущих и один для отставающих нулей.
Эта проблема имеет край случае: что мы хотим сделать, когда вход содержит только нули? Верните пустую Струнные , или Струнные содержащие один ноль? Мы увидим реализации для обоих случаев использования в каждом из решений.
У нас есть унитарные тесты для каждой реализации, которые вы можете найти на GitHub .
2. Использование StringBuilder
В нашем первом решении мы создадим Стрингбилдер с оригинальной Струнные , и мы удалим ненужные символы от начала или конца:
String removeLeadingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 0 && sb.charAt(0) == '0') { sb.deleteCharAt(0); } return sb.toString(); } String removeTrailingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 0 && sb.charAt(sb.length() - 1) == '0') { sb.setLength(sb.length() - 1); } return sb.toString(); }
Обратите внимание, что мы используем StringBuilder.setLength () вместо StringBuilder.deleteCharAt() когда мы удаляем задние нули, потому что он также удаляет последние несколько символов, и это более провыполнения.
Если мы не хотят возвращать пустую Струнные когда вход содержит только нули, единственное, что нам нужно сделать, это остановить цикл, если есть только один символ, оставшийся .
Таким образом, мы меняем состояние цикла:
String removeLeadingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 1 && sb.charAt(0) == '0') { sb.deleteCharAt(0); } return sb.toString(); } String removeTrailingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 1 && sb.charAt(sb.length() - 1) == '0') { sb.setLength(sb.length() - 1); } return sb.toString(); }
3. Использование String.subString()
В этом решении, когда мы удаляем ведущие или задние нули, мы найти положение первого или последнего ненулевого персонажа.
После этого, мы только должны позвонить субструинг () , чтобы вернуть оставшиеся части:
String removeLeadingZeroes(String s) { int index; for (index = 0; index < s.length(); index++) { if (s.charAt(index) != '0') { break; } } return s.substring(index); } String removeTrailingZeroes(String s) { int index; for (index = s.length() - 1; index >= 0; index--) { if (s.charAt(index) != '0') { break; } } return s.substring(0, index + 1); }
Обратите внимание, что мы должны объявить переменную индекс перед циклом, потому что мы хотим использовать переменную вне области цикла.
Также обратите внимание, что мы должны искать ненуленые символы вручную, так как String.indexOf() и String.lastIndexOf() работать только для точного соответствия.
Если мы не хотят возвращать пустую Струнные , мы должны сделать то же самое, как и раньше: изменить состояние цикла :
String removeLeadingZeroes(String s) { int index; for (index = 0; index < s.length() - 1; index++) { if (s.charAt(index) != '0') { break; } } return s.substring(index); } String removeTrailingZeroes(String s) { int index; for (index = s.length() - 1; index > 0; index--) { if (s.charAt(index) != '0') { break; } } return s.substring(0, index + 1); }
4. Использование Apache Commons
Apache Commons имеет много полезных классов, в том числе org.apache.commons.lang.StringUtils . Точнее, этот класс находится в Apache Commons Lang3.
4.1. Зависимости
Мы можем использовать Apache Commons Lang3 путем вставки этой зависимости в нашу пом.xml файл:
org.apache.commons commons-lang3 3.11
4.2. Осуществление
В СтрингУтилс класса, у нас есть методы stripStart () и stripEnd () . Они удаляют ведущие и задние символы соответственно.
Так как это именно то, что нам нужно, наше решение довольно просто:
String removeLeadingZeroes(String s) { return StringUtils.stripStart(s, "0"); } String removeTrailingZeroes(String s) { return StringUtils.stripEnd(s, "0"); }
К сожалению, мы не можем настроить, если мы хотим удалить все случаи или нет. Поэтому управлять им нужно вручную.
Если вход не был пуст, но раздели Струнные пуст, то мы должны вернуть ровно один ноль:
String removeLeadingZeroes(String s) { String stripped = StringUtils.stripStart(s, "0"); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; } String removeTrailingZeroes(String s) { String stripped = StringUtils.stripEnd(s, "0"); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; }
Обратите внимание, что эти методы принимают Струнные в качестве второго параметра. Этот Струнные представляет набор символов, а не последовательность, которую мы хотим удалить.
Например, если мы “01” , они будут удалять любые ведущие или задние символы, которые либо ‘0’ или ‘1’ .
5. Использование Гуавы
Гуава также предоставляет множество классов утилиты. Для этой проблемы, мы можем использовать com.google.common.base.CharMatcher , который предоставляет полезные методы взаимодействия с соответствующими символами.
5.1. Зависимости
Чтобы использовать Гуаву, мы должны добавить следующие зависимостей к нашему пом.xml файл:
com.google.guava guava 27.0.1-jre
Обратите внимание, что если мы хотим использовать Guava в приложении Android, мы должны использовать версию 27.0-андроид вместо.
5.2. Осуществление
В нашем случае, мы заинтересованы в trimLeadingИз() и trimTrailingFrom() .
Как следует из их названия, они удаляют любой ведущий или задний характер соответственно из Струнные , который соответствует ЧарМатчер :
String removeLeadingZeroes(String s) { return CharMatcher.is('0').trimLeadingFrom(s); } String removeTrailingZeroes(String s) { return CharMatcher.is('0').trimTrailingFrom(s); }
Они имеют те же характеристики, что и методы Apache Commons, которые мы видели.
Поэтому, если мы не хотим удалять все нули, мы можем использовать один и тот же трюк:
String removeLeadingZeroes(String s) { String stripped = CharMatcher.is('0').trimLeadingFrom(s); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; } String removeTrailingZeroes(String s) { String stripped = CharMatcher.is('0').trimTrailingFrom(s); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; }
Обратите внимание, что с ЧарМатчер мы можем создать более сложные правила сопоставления.
6. Использование регулярных выражений
Поскольку наша проблема заключается в проблеме сопоставления шаблонов, мы можем использовать регулярные выражения: мы хотим, чтобы соответствовать всем нулей в начале или из Струнные .
Вдобавок к этому, мы хотим удалить эти соответствующие нули. Другими словами, мы хотим заменить их ничем, или, другими словами, пустой Струнные .
Мы можем сделать именно это, с String.replaceAll () метод:
String removeLeadingZeroes(String s) { return s.replaceAll("^0+", ""); } String removeTrailingZeroes(String s) { return s.replaceAll("0+$", ""); }
Если мы не хотим удалять все нули, мы можем использовать то же решение, которое мы использовали с Apache Commons и Guava. Тем не менее, есть чистый регулярный способ выражения сделать это: мы должны предоставить шаблон, который не соответствует всей Струнные .
Таким образом, если вход содержит только нули, двигатель regexp будет держать ровно один из соответствия. Мы можем сделать это со следующими шаблонами:
String removeLeadingZeroes(String s) { return s.replaceAll("^0+(?!$)", ""); } String removeTrailingZeroes(String s) { return s.replaceAll("(?!^)0+$", ""); }
Обратите внимание, что “(?! ^)” и “(?! $)” означает, что это не начало или конец Струнные соответственно.
7. Заключение
В этом учебнике мы увидели несколько способов удаления ведущих и задних символов из Струнные . Выбор между этими реализациями часто просто личные предпочтения.
Как обычно, примеры доступны более на GitHub .