Эй, Java так требовательна к разбиению строки

Java

Когда дело доходит до разбиения строк в Java, я думаю, вы, вероятно, скажете что-то жестокое: «Что в этом такого сложного, иди сразу к классу String.split()Метод не тянет! «Если вы действительно так думаете, то вам следует обратить внимание, все далеко не так просто.

Давай, отодвинь небольшую скамейку и присядь.

Если есть такая строка символов "Silent King Er, интересный программист", ее нужно разбить по китайской запятой ",", что означает, что первая строка символов перед запятой - "Silent King Er", и вторая строка перед запятой "Silent King Er" Вторая строка символов после запятой "интересный программист" (не чепуха). Кроме того, перед разбиением проверьте, содержит ли строка запятые, иначе должно быть выдано исключение.

public class Test {
    public static void main(String[] args) {
        String cmower = "沉默王二,一枚有趣的程序员";
        if (cmower.contains(",")) {
            String [] parts = cmower.split(",");
            System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
        } else {
            throw new IllegalArgumentException("当前字符串没有包含逗号");
        }
    }
}

Этот код выглядит довольно строгим, не так ли? Вывод программы точно такой, как ожидалось:

第一部分:沉默王二 第二部分:一枚有趣的程序员

Это основано на том, что определяется строка, и самое главное, что определяется разделитель. Иначе беда придет.

Английских специальных символов около 12. Если эти специальные символы используются непосредственно для замены разделителя (китайской запятой) в приведенном выше коде, при запуске этой программы возникнет следующая ошибка.

  • обратная косая черта\(Исключение ArrayIndexOutOfBoundsException)
  • каре^(то же, что и выше)
  • Знак доллара$(то же, что и выше)
  • запятая.(то же, что и выше)
  • вертикальная полоса|(нормально, без ошибок)
  • вопросительный знак?(исключение синтаксиса шаблона)
  • Звездочка*(то же, что и выше)
  • плюс+(то же, что и выше)
  • левая или правая скобка()(то же, что и выше)
  • левая или правая квадратная скобка[](то же, что и выше)
  • левая или правая скоба{}(то же, что и выше)

Увидев это, некоторые мелкие партнеры могут сказать: «Это не чушь собачья». Не хороший вкус.

Что делать, если я столкнулся со специальными символами? О регулярном выражении chant.

Регулярное выражение — это специальный набор текста, состоящий из букв и символов, который можно использовать для поиска предложений из текста, удовлетворяющих нужному вам формату.

Тогда могут быть некоторые друзья, которые скажут: «Есть так много регулярных выражений, я не могу их запомнить!» Не волнуйтесь, я уже нашел решение для вас.

Ссылка ниже — это онлайн-документ на GitHub для изучения регулярных выражений, который очень подробен. Когда вы столкнетесь с регулярными выражениями, просто достаньте это руководство, и все готово. Неважно, что вы не можете запомнить так много регулярных выражений, просто изучите и используйте их.

GitHub.com/C doc O/learn…

Кроме этого документа есть еще один:

GitHub.com/C doc O/com Мо…

Автор собрал некоторые регулярные выражения, которые часто используются в обычной разработке проектов, которые можно использовать напрямую, замечательно.

После решения болезни сердца заменим разделитель на английскую запятую ".":

String cmower = "沉默王二.一枚有趣的程序员";
if (cmower.contains(".")) {
    String [] parts = cmower.split("\\.");
    System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}

в настоящее время используетsplit()метод, вам нужно использовать регулярные выражения\\.Для замены специального символа английской запятой ".". Зачем использовать две обратные косые черты? Поскольку это особый символ сам по себе, его нужно сначала экранировать.

Также можно использовать классы символов.[]содержать запятую ".", которая также является регулярным выражением, которое соответствует любому символу, заключенному в квадратные скобки.

cmower.split("[.]");

В дополнение к этому вы также можете использовать класс Patternquote()метод переноса английской запятой ".", метод вернет использование\Q\EОбмотанная струна.

В настоящее время,String.split()Пример использования метода показан ниже:

String [] parts = cmower.split(Pattern.quote("."));

При входе через режим отладкиString.split()Если вы посмотрите на исходный код метода, вы найдете следующие детали:

return Pattern.compile(regex).split(this, limit);

струнныйsplit()Метод вызывает класс Patternsplit()метод. Это означает, что у нас появилась новая возможность разбивать строки без использования класса String.split()метод.

public class TestPatternSplit {
    /**
     * 使用预编译功能,提高效率
     */
    private static Pattern twopart = Pattern.compile("\\.");

    public static void main(String[] args) {
        String [] parts = twopart.split("沉默王二.一枚有趣的程序员");
        System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
    }
}

Кроме того, вы также можете использовать Pattern с классом Matcher для разделения строк. Преимущество этого заключается в том, что вы можете наложить некоторые строгие ограничения на разделяемые строки. Давайте посмотрим на пример кода:

public class TestPatternMatch {
    /**
     * 使用预编译功能,提高效率
     */
    private static Pattern twopart = Pattern.compile("(.+)\\.(.+)");

    public static void main(String[] args) {
        checkString("沉默王二.一枚有趣的程序员");
        checkString("沉默王二.");
        checkString(".一枚有趣的程序员");
    }

    private static void checkString(String str) {
        Matcher m = twopart.matcher(str);
        if (m.matches()) {
            System.out.println("第一部分:" + m.group(1) + " 第二部分:" + m.group(2));
        } else {
            System.out.println("不匹配");
        }
    }
}

В этом случае регулярное выражение(.+)\\.(.+), что означает, что строка может быть разделена на группу символов в соответствии с английской запятой, английскими скобками()Это то, что он делает (ознакомьтесь с руководством по регулярным выражениям, которое я предоставил ранее).

Поскольку шаблон является детерминированным, выражение Pattern можно поместить вmain()Вне метода повысить эффективность программы с помощью статической функции прекомпиляции.

Взгляните на вывод программы:

第一部分:沉默王二 第二部分:一枚有趣的程序员
不匹配
不匹配

Однако использование Matcher для сопоставления некоторых простых строк является относительно тяжелым, используя класс Stringsplit()Тем не менее предпочтительнее, так как этот метод имеет некоторые другие интересные функции.

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

String cmower = "沉默王二,一枚有趣的程序员";
if (cmower.contains(",")) {
    String [] parts = cmower.split("(?<=,)");
    System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}

Вывод программы следующий:

第一部分:沉默王二, 第二部分:一枚有趣的程序员

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

String [] parts = cmower.split("(?=,)");

Некоторым друзьям может быть любопытно,?<=и?=Что это? На самом деле это шаблон утверждения в регулярных выражениях.

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

Кроме того, если строка содержит несколько разделителей, а нам нужно только 2, мы также можем сделать это:

String cmower = "沉默王二,一枚有趣的程序员,宠爱他";
if (cmower.contains(",")) {
    String [] parts = cmower.split(",", 2);
    System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}

split()Метод может передавать 2 параметра, первый — разделитель, а второй — количество строк для разделения. Если вы посмотрите на исходный код этого метода, то увидите следующее:

непосредственныйsubstring()до конца исходной строки, то есть без разделения по второму разделителю. Затем вырваться из петли. Взгляните на вывод программы:

第一部分:沉默王二 第二部分:一枚有趣的程序员,宠爱他

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

Я Silent King Er, интересный программист. Если вы считаете, что статья полезна для вас, пожалуйста, выполните поиск по запросу "Тихий король 2"Читал в первый раз.

Ответить【666] Есть также обучающие видео высокой четкости 500G (по категориям), которые я тщательно подготовил для вас. эта статьяGitHubОн был включен, и есть полные тестовые площадки для интервью на крупных заводах Добро пожаловать в Star.

Оригинальность непроста, не просите пустой билет, пожалуйста, поставьте лайк этой статье, что будет моей сильнейшей мотивацией писать больше качественных статей.