Как убрать начальные нули из буквенно-цифрового текста? - PullRequest
194 голосов
/ 10 мая 2010

Я видел вопросы о том, как префиксировать нули здесь в SO. Но не наоборот!

Не могли бы вы, ребята, подсказать, как убрать начальные нули в буквенно-цифровом тексте? Существуют ли какие-либо встроенные 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

Ответы [ 18 ]

558 голосов
/ 10 мая 2010

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+(?!$)", "") + "]");
}

Смотри также

84 голосов
/ 17 декабря 2013

Вы можете использовать класс StringUtils из Apache Commons Lang следующим образом:

StringUtils.stripStart(yourString,"0");
29 голосов
/ 10 мая 2010

Как насчет регулярного выражения:

String s = "001234-a";
s = s.replaceFirst ("^0*", "");

^ привязывает к началу строки (я предполагаю, что из контекста ваши строки здесь не многострочные, в противном случае вам может понадобиться заглянуть в \A для начала ввода, а не начала строки) , 0* означает ноль или более 0 символов (вы могли бы также использовать 0+). replaceFirst просто заменяет все эти 0 символы в начале ничем.

И если, как и Вадим, ваше определение ведущих нулей не включает превращение "0" (или "000" или подобных строк) в пустую строку (достаточно рациональное ожидание), просто при необходимости верните ее обратно: 1017 *

String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";
17 голосов
/ 17 августа 2011

Четкий путь без использования regExp и каких-либо внешних библиотек.

public static String trimLeadingZeros(String source) {
    for (int i = 0; i < source.length(); ++i) {
        char c = source.charAt(i);
        if (c != '0') {
            return source.substring(i);
        }
    }
    return ""; // or return "0";
}
12 голосов
/ 10 мая 2010

В ответ на ответ theachest Apache Commons: используя guava-библиотеки (универсальная служебная библиотека Java от Google, которую я бы поспорил, теперь должна находиться в classpath любого нетривиального проекта Java), используйте CharMatcher :

CharMatcher.is('0').trimLeadingFrom(inputString);
5 голосов
/ 10 мая 2010

Используйте Apache Commons StringUtils класс:

StringUtils.strip(String str, String stripChars);
3 голосов
/ 11 октября 2018

Вы можете просто сделать: String s = Integer.valueOf("0001007").toString();

2 голосов
/ 12 марта 2016

Использование регулярных выражений, как показывают некоторые ответы, является хорошим способом сделать это. Если вы не хотите использовать регулярные выражения, вы можете использовать этот код:

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}
2 голосов
/ 17 января 2013

Используйте это:

String x = "00123".replaceAll("^0*", ""); // -> 123
2 голосов
/ 15 марта 2012

Использование регулярных выражений с группами:

Pattern pattern = Pattern.compile("(0*)(.*)");
String result = "";
Matcher matcher = pattern.matcher(content);
if (matcher.matches())
{
      // first group contains 0, second group the remaining characters
      // 000abcd - > 000, abcd
      result = matcher.group(2);
}

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