Этот пост является обновлением этого: получить определенный символ в строке с регулярным выражением и удалить неиспользуемый ноль
Во-первых, я хотел удалить с помощью регулярного выражения неиспользуемый ноль в последнем совпадении.
Я обнаружил, что регулярное выражение немного излишне для того, что мне нужно.
Вот что я хотел бы сейчас,
Я хотел бы использовать метод split()
чтобы получить от этого:
String myString = "2020-LI50532-3329-00100"
этот :
String data1 = "2020"
String data2 = "LI50532"
String data3 = "3329"
String data4 = "00100"
Тогда я могу удалить из ПОСЛЕДНЕГО data
неиспользованный ноль
преобразовать "00100" в "100"
А затем объединить все данные, чтобы получить это
"2020-LI50532-3329-100"
Я не знаком с методом разделения, если кто-нибудь может просветить меня по этому поводу ^^
Вы можете использовать метод substring
, чтобы избавиться от лидирующих нулей...
String myString = "2020-LI50532-3329-00100";
String[] data = myString.split("-");
data[3] = data[3].substring(2);
StringBuilder sb = new StringBuilder();
sb.append(data[0] + "-" + data[1] + "-" + data[2] + "-" + data[3]);
String result = sb.toString();
System.out.println(result);
Вы всегда можете выполнить итерацию data[3]
, чтобы проверить индекс первого «действительного» числа и подстроку из этого индекса, удачи!
public class Test {
public static void main(String[] args) {
System.out.println(trimLeadingZeroesFromLastPart("2020-LI50532-03329-00100"));
}
private static String trimLeadingZeroesFromLastPart(String input) {
String delem = "-";
String result = "";
if (input != null && !input.isEmpty()) {
String[] data = input.split(delem);
StringBuilder tempStrBldr = new StringBuilder();
for (int idx = 0; idx < data.length; idx++) {
if (idx == data.length - 1) {
tempStrBldr.append(trimLeadingZeroes(data[idx]));
} else {
tempStrBldr.append(data[idx]);
}
tempStrBldr.append(delem);
}
result = tempStrBldr.substring(0, tempStrBldr.length() - 1);
}
return result;
}
private static String trimLeadingZeroes(String input) {
int idx;
for (idx = 0; idx < input.length() - 1; idx++) {
if (input.charAt(idx) != '0') {
break;
}
}
return input.substring(idx);
}
}
Выход:
2020-LI50532-3329-100
Привет, спасибо за ответ. Как я уже говорил в другом посте, здесь та же проблема. Я не хочу, чтобы все неиспользованные нули удалялись, вот что происходит: «2020-LI50532-03329-00100» должно возвращать «2020-LI50532-03329-100». "но с вашим методом он фактически возвращает 2020-LI50532-3329-100" я хочу удалить ТОЛЬКО последний неиспользованный ноль
с моим решением, если я использую String myString = "2020-LI50532-03329-00100", тогда вывод будет "2020-LI50532-03329-100"
вы можете преобразовать последнюю часть строки в целочисленный тип, как показано ниже, для удаления неиспользуемых нулей:
String myString = "2020-LI50532-3329-00100";
String[] data = myString.split("-");
data[3] = data[3].substring(2);
StringBuilder sb = new StringBuilder();
sb.append(data[0] + "-" + data[1] + "-" + data[2] + "-" + Integer.parseInt(data[3]));
String result = sb.toString();
System.out.println(result);
public class Main {
public static void main(String[] args) {
// Test
System.out.println(parse("2020-LI50532-3329-00100"));
System.out.println(parse("2020-LI50532-3329-00001"));
System.out.println(parse("2020-LI50532-03329-00100"));
System.out.println(parse("2020-LI50532-03329-00001"));
}
static String parse(String str) {
return str.replaceAll("0+(?=[1-9]\\d*$)", "");
}
}
Выход:
2020-LI50532-3329-100
2020-LI50532-3329-1
2020-LI50532-03329-100
2020-LI50532-03329-1
Объяснение регулярного выражения:
Один или несколько нулей , за которыми следует ненулевая цифра, за которой может следовать любая цифра (цифры) до конца строки (указывается $
).
Вы также можете сделать это, используя Integer.parseInt
, который может разобрать строку, подобную 00100
, в 100
.
public class Main {
public static void main(String[] args) {
// Test
System.out.println(parse("2020-LI50532-3329-00100"));
System.out.println(parse("2020-LI50532-3329-00001"));
System.out.println(parse("2020-LI50532-03329-00100"));
System.out.println(parse("2020-LI50532-03329-00001"));
}
static String parse(String str) {
String[] parts = str.split("-");
try {
parts[parts.length - 1] = String.valueOf(Integer.parseInt(parts[parts.length - 1]));
} catch (NumberFormatException e) {
// Do nothing
}
return String.join("-", parts);
}
}
Выход:
2020-LI50532-3329-100
2020-LI50532-3329-1
2020-LI50532-03329-100
2020-LI50532-03329-1
Привет, спасибо за ответ. Проблема в том, что все неиспользуемые нули будут удалены, вот что произойдет: «2020-LI50532-03329-00100» должен вернуть «2020-LI50532-03329-100», но с вашим методом он на самом деле возвращает 2020-LI50532- 3329-100" я хочу удалить ТОЛЬКО последний неиспользованный ноль
@SWah - я думал, ты хочешь сделать это с каждой частью. Я обновил ответ, чтобы сделать это только с последней частью. Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.
@SWah - я также добавил чистое регулярное выражение. Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.
По возможности следует избегать манипуляций со строками и полагаться на существующие типы в языке Java. Одним из таких типов является Integer. Похоже, ваш код состоит из 4 частей - Год (Целое число) - Строка - Целое число - Целое число.
Поэтому для правильной проверки я бы использовал следующий код:
Scanner scan = new Scanner("2020-LI50532-3329-00100");
scan.useDelimiter("-");
Integer firstPart = scan.nextInt();
String secondPart = scan.next();
Integer thirdPart = scan.nextInt();
Integer fourthPart = scan.nextInt();
Или, как вариант, что-то вроде:
String str = "00100";
int num = Integer.parseInt(str);
System.out.println(num);
Если вы хотите восстановить исходное значение, вам, вероятно, следует использовать NumberFormat для добавления недостающих нулей.
Основные моменты:
Предполагая, что мы хотим удалить ведущие нули ТОЛЬКО в последнем блоке, возможно, мы сможем:
Что-то вроде этого:
public String removeLeadingZeroesFromLastBlock(String text) {
int indexOfLastDelimiter = text.lastIndexOf('-');
if (indexOfLastDelimiter >= 0) {
String lastBlock = text.substring(indexOfLastDelimiter + 1);
String lastBlockWithoutLeadingZeroes = String.valueOf(Integer.valueOf(lastBlock)); // will throw exception if last block is not an int
return text.substring(0, indexOfLastDelimiter + 1).concat(lastBlockWithoutLeadingZeroes);
}
return text;
}
Привет, спасибо за ответ ! Итак, проблема в том, что у меня не всегда будет одна и та же строка при вводе. Я привожу это как пример "2020-LI50532-3329-00100". Но это может быть и этот "2020-LI50532-3329-00001", или этот "2020-LI50532-3329-100" и т.д..