Я видел вопросы о том, как снабдить префиксом нули здесь в ТАК. Но не другой путь!
Можете Вы парни предлагать меня, как удалить начальные нули в алфавитно-цифровом тексте? Есть ли какие-либо встроенные API, или я должен записать метод для обрезки начальных нулей?
Пример:
01234 converts to 1234
0001234a converts to 1234a
001234-a converts to 1234-a
101234 remains as 101234
2509398 remains as 2509398
123z remains as 123z
000002829839 converts to 2829839
Regex - лучший инструмент для работы; каким оно должно быть, зависит от спецификации проблемы. Следующий код удаляет ведущие нули, но оставляет единицу, если необходимо (т.е. он не просто превращает «0»
в пустую строку).
s.replaceFirst("^0+(?!$)", "")
Якорь ^
гарантирует, что сопоставленный 0+
находится в начале ввода. Отрицательный просмотр вперед (?! $)
гарантирует, что не будет сопоставлена вся строка.
Тестовая оснастка:
String[] in = {
"01234", // "[1234]"
"0001234a", // "[1234a]"
"101234", // "[101234]"
"000002829839", // "[2829839]"
"0", // "[0]"
"0000000", // "[0]"
"0000009", // "[9]"
"000000z", // "[z]"
"000000.z", // "[.z]"
};
for (String s : in) {
System.out.println("[" + s.replaceFirst("^0+(?!$)", "") + "]");
}
Вы можете заменить "^0*(.*)"
на "$1"
с помощью regex
Я думаю, что это так легко сделать. Вы можете просто перебирать строку с самого начала и удалять нули, пока не найдете ненулевой символ.
int lastLeadZeroIndex = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '0') {
lastLeadZeroIndex = i;
} else {
break;
}
}
str = str.subString(lastLeadZeroIndex+1, str.length());
Используйте класс Apache Commons StringUtils
:
StringUtils.strip(String str, String stripChars);
Как насчет способа регулярного выражения:
String s = "001234-a";
s = s.replaceFirst ("^0*", "");
^
привязки к началу строка (я предполагаю из контекста, что ваши строки здесь не многострочные, в противном случае вам может потребоваться поиск в \ A
для начала ввода, а не для начала строки). 0 *
означает ноль или более 0
символов (вы можете также использовать 0+
). replaceFirst
просто заменяет все эти 0
символы в начале ни на что.
И если, как и Вадим, ваше определение ведущих нулей не включает превращение «0»
(или «000»
или подобных строк) в пустую строку (рациональную достаточно ожидания), просто верните его, если необходимо:
String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";
Чтобы пойти с ответом thelost Apache Commons: использование guava-библиотек (универсальная служебная библиотека Java от Google, которая, я бы сказал, теперь должна быть в пути к классам любого нетривиального проекта Java), это будет использовать CharMatcher :
CharMatcher.is('0').trimLeadingFrom(inputString);