Как удалить ведущие нули из буквенно-цифрового текста?

Я видел вопросы о том, как префикс нулей здесь в 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

Ответ 1

Regex - лучший инструмент для работы; то, что должно быть, зависит от спецификации проблемы. Следующее удаляет ведущие нули, но при необходимости оставляет один (т.е. Не просто превратит "0" в пустую строку).

s.replaceFirst("^0+(?!$)", "")

Якорь ^ будет следить за тем, чтобы соответствие 0+ находилось в начале ввода. (?!$) отрицательный lookahead гарантирует, что не вся строка будет сопоставлена.

Жгут проводов:

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

См. также

Ответ 2

Вы можете использовать класс StringUtils из Apache Commons Lang вот так:

StringUtils.stripStart(yourString,"0");

Ответ 3

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

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";

Ответ 4

Четкий путь без использования 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";
}

Ответ 5

Чтобы перейти с более полным ответом Apache Commons: используя guava-libraries (общедоступная библиотека Java для Java, о которой я бы сказал, теперь должна быть включена путь класса любого нетривиального Java-проекта), это использовало бы CharMatcher:

CharMatcher.is('0').trimLeadingFrom(inputString);

Ответ 6

Использование Apache Commons StringUtils класс:

StringUtils.strip(String str, String stripChars);

Ответ 7

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

Ответ 8

Использование Regexp с группами:

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;

Ответ 9

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

String x = "00123".replaceAll("^0*", ""); // -> 123

Ответ 10

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

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}

Ответ 11

Я думаю, что это так легко сделать. Вы можете просто перебрать строку с начала и удалить нули, пока не найдете нулевое значение char.

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());

Ответ 12

Если вам (как и мне) необходимо удалить все ведущие нули из каждого слова в строке, вы можете изменить ответ @polygenelubricants на следующее:

String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");

что приводит к:

3 d0g ss 0 0 0

Ответ 13

Если вы используете Kotlin Это единственный код, который вам нужен:

yourString.trimStart('0')

Ответ 14

Вы можете заменить "^0*(.*)" на "$1" на regex

Ответ 15

       String s="0000000000046457657772752256266542=56256010000085100000";      
    String removeString="";

    for(int i =0;i<s.length();i++){
      if(s.charAt(i)=='0')
        removeString=removeString+"0";
      else 
        break;
    }

    System.out.println("original string - "+s);

    System.out.println("after removing 0 -"+s.replaceFirst(removeString,""));

Ответ 16

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

String input="0000008008451"
String output = input.trim();
for( ;output.length() > 1 && output.charAt(0) == '0'; output = output.substring(1));

System.out.println(output);//8008451

Ответ 17

Я провел несколько эталонных тестов и обнаружил, что самый быстрый способ (на сегодняшний день) - это решение:

    private static String removeLeadingZeros(String s) {
      try {
          Integer intVal = Integer.parseInt(s);
          s = intVal.toString();
      } catch (Exception ex) {
          // whatever
      }
      return s;
    }

Особенно регулярные выражения очень медленны в длительной итерации. (Мне нужно было узнать самый быстрый способ для batchjob.)

Ответ 18

Без использования функции Regex или substring() на String, которая будет неэффективной -

public static String removeZero(String str){
        StringBuffer sb = new StringBuffer(str);
        while (sb.length()>1 && sb.charAt(0) == '0')
            sb.deleteCharAt(0);
        return sb.toString();  // return in String
    }

Ответ 19

А как насчет только поиска первого ненулевого символа?

[1-9]\d+

Это регулярное выражение находит первую цифру между 1 и 9, за которой следует любое количество цифр, поэтому для "00012345" он возвращает "12345" . Он может быть легко адаптирован для буквенно-цифровых строк.