Как удалить ведущие нули из буквенно-цифрового текста?
Я видел вопросы о том, как префикс нулей здесь в 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" .
Он может быть легко адаптирован для буквенно-цифровых строк.