Разделить строку из последней итерации

Этот пост является обновлением этого: получить определенный символ в строке с регулярным выражением и удалить неиспользуемый ноль

Во-первых, я хотел удалить с помощью регулярного выражения неиспользуемый ноль в последнем совпадении.

Я обнаружил, что регулярное выражение немного излишне для того, что мне нужно.


Вот что я хотел бы сейчас,

Я хотел бы использовать метод 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"

Я не знаком с методом разделения, если кто-нибудь может просветить меня по этому поводу ^^

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
119
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете использовать метод 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);

Привет, спасибо за ответ ! Итак, проблема в том, что у меня не всегда будет одна и та же строка при вводе. Я привожу это как пример "2020-LI50532-3329-00100". Но это может быть и этот "2020-LI50532-3329-00001", или этот "2020-LI50532-3329-100" и т.д..

SWah 15.12.2020 14:42

Вы всегда можете выполнить итерацию data[3], чтобы проверить индекс первого «действительного» числа и подстроку из этого индекса, удачи!

user157629 15.12.2020 16:11
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" я хочу удалить ТОЛЬКО последний неиспользованный ноль

SWah 15.12.2020 15:34

с моим решением, если я использую String myString = "2020-LI50532-03329-00100", тогда вывод будет "2020-LI50532-03329-100"

amitd 15.12.2020 15:40

вы можете преобразовать последнюю часть строки в целочисленный тип, как показано ниже, для удаления неиспользуемых нулей:

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 15.12.2020 15:27

@SWah - я думал, ты хочешь сделать это с каждой частью. Я обновил ответ, чтобы сделать это только с последней частью. Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

Arvind Kumar Avinash 15.12.2020 15:34

@SWah - я также добавил чистое регулярное выражение. Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

Arvind Kumar Avinash 15.12.2020 16:07

По возможности следует избегать манипуляций со строками и полагаться на существующие типы в языке 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 для добавления недостающих нулей.

Основные моменты:

  • Всегда старайтесь повторно использовать существующий код и инструменты, доступные на вашем языке.
  • Всегда старайтесь использовать доступные типы (LocalDate, Integer, Long)
  • Создавайте собственные типы (классы) и используйте выразительность объектно-ориентированного языка.

Предполагая, что мы хотим удалить ведущие нули ТОЛЬКО в последнем блоке, возможно, мы сможем:

  1. Извлечь последний блок
  2. Преобразуйте его в целое число и обратно в строку, чтобы удалить ведущие нули.
  3. Замените последний блок строкой, полученной на предыдущем шаге.

Что-то вроде этого:

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

Другие вопросы по теме