Рубрики
Без рубрики

Регулярное выражение Java: часть 7 – Извлечение текста с помощью java.util. Сканер

Привет и с возвращением. В этой части я покажу вам, как мы можем использовать класс Scanner в пакете java.util для извлечения текста из строки. Прежде чем углубляться в примеры, давайте обсудим…

Автор оригинала: Sera.Ng.

Привет и с возвращением. В этой части я покажу вам, как мы можем использовать класс Scanner в пакете java.util для извлечения текста из строки. Прежде чем углубляться в примеры, давайте обсудим две концепции токенов и разделителей. В строке есть 2 типа текста: токены и разделители . Маркеры-это значимые слова, а разделители-это символы, разделяющие маркеры. Например, у меня есть строка: Я так сильно тебя люблю . Итак, в строке: токены : Я, люблю, тебя, так, и многое другое разделители : пробелы. Однако, что такое токены и разделители, во многом зависит от наших целей. Например, мы можем использовать пробелы в качестве разделителей; или мы можем указать любые символы для работы в качестве разделителей. Почти все методы разделения строк в Java используют символ пробела в качестве разделителя по умолчанию. В этом сеансе мы будем использовать класс Scanner для извлечения текста на основе определенных разделителей или на основе шаблона. Очень часто мы используем класс scanner для получения входных данных от пользователей через пользовательский интерфейс консоли, указывая системный ввод в качестве параметра конструктора. На самом деле класс сканера может использовать свой источник ввода в качестве системного ввода, или строковой переменной, или файла. Первый метод, который мы можем использовать для разделения строки на токены, – это метод next() в классе сканера, который использует пробелы в качестве разделителя по умолчанию. Давайте посмотрим какой-нибудь код:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc;
        String s = "I love you so much. I want to marry you";
        sc = new Scanner(s);
        while (sc.hasNext()) {
            String token = sc.next();
            System.out.println(token);
        }
    }
}

В приведенном выше коде сначала был создан экземпляр сканера. И вместо того, чтобы пройти System.in объект конструктору, я передал строковые переменные, потому что нам нужно было прочитать, а затем манипулировать строкой:

String s = "I love you so much. I want to marry you";
sc = new Scanner(s);

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

while (sc.hasNext())

Метод hasNext() возвращает значение true, если токена больше, в противном случае возвращается значение false, что также указывает на то, что достигнут конец строки. По умолчанию метод hasNext() использует пробелы в качестве разделителя для разделения и навигации между токенами. Метод hasNext() считывает токен и останавливается, если он достигает разделителя. Если метод продолжает вызываться, он считывает следующий токен и останавливается, если достигает другого разделителя. Весь процесс повторяется до тех пор, пока токена больше не останется. На самом деле метод hasNext() не считывает токены, а просто проверяет, остались ли еще какие-либо токены.

String token = sc.next();

Запустите программу, и мы получим результаты:

I
love
you
so
much.
I
want
to
marry
you

Мы получили вышеуказанные результаты, потому что, как упоминалось ранее, по умолчанию метод hasNext() использует пробелы в качестве разделителей. Однако мы можем сообщить методу hasNext (), чтобы он использовал любые символы в качестве разделителей. Например, теперь я хочу использовать в качестве разделителей символы пробела и точки (.). Это можно сделать вот так:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc;
        String s = "I love you so much. I want to marry you";
        sc = new Scanner(s);
        sc.useDelimiter("[ .]");
        while (sc.hasNext()) {
            String token = sc.next();
            System.out.println(token);
        }
    }
}

В коде я добавил следующий вызов метода:

sc.useDelimiter("[ .]");

Метод useDelimiter() используется для информирования метода hasNext() о том, что следует использовать в качестве разделителей. И, как вы можете заметить, я указал пробелы и точки. Обратите внимание, что когда мы используем пользовательские разделители с помощью метода useDelimiter () , символы пробела больше не являются символами по умолчанию. Поэтому, если вы хотите использовать пробелы в качестве разделителей, вам нужно явно заявить об этом, как мы только что сделали. Теперь пришло время запустить программу:

I
love
you
so
much

I
want
to
marry
you

В выводе вы можете видеть пустую строку. Это потому, что мы использовали в качестве разделителей как пробелы, так и точечные символы. И было время, когда эти 2 символа стояли рядом друг с другом (между словом много и Я ). Если мы хотим рассматривать 2 (или более) символа-разделителя, расположенных рядом друг с другом, как один, то нам нужно применить один символ-квантор следующим образом:

sc.useDelimiter("[ .]+");

Запустите программу еще раз:

I
love
you
so
much
I
want
to
marry
you

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

I love you 4 so much. 34 I 23 want to marry you

В строке есть цифры, и я хочу разбить строку на подстроки на основе этих цифр. Я могу выполнить эту задачу следующим образом:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc;
        String s = "I love you 4 so much. 34 I 23 want to marry you";
        sc = new Scanner(s);
        sc.useDelimiter("\\d+");
        while (sc.hasNext()) {
            String token = sc.next();
            System.out.println(token);
        }
    }
}

Как вы можете заметить, я использовал шаблон цифр в качестве параметра в методе useDelimiter():

sc.useDelimiter("\\d+");

А также обратите внимание, что нам нужно использовать знак плюс ( + ), чтобы, если цифры находятся рядом друг с другом, они рассматривались как одна цифра. Запустите программу, и у нас будет:

I love you 
 so much. 
 I 
 want to marry you

В приведенном выше случае мы также можем сделать обратное, что означает, что мы можем получить все числа: 4, 34 и 23. Это означает, что я буду использовать все символы в качестве разделителей, кроме цифр. Чтобы выполнить эту задачу, все, что нам нужно сделать, – это внести незначительные изменения в шаблон:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc;
        String s = "I love you 4 so much. 34 I 23 want to marry you";
        sc = new Scanner(s);
        sc.useDelimiter("[^\\d]+");
        while (sc.hasNext()) {
            String token = sc.next();
            System.out.println(token);
        }
    }
}

Как вы можете видеть, я использовал знак каретки (^) прямо перед \d, и я думаю, вы все еще помните, что знак каретки означает “кроме”. Таким образом, шаблон означает, что в качестве разделителей будут использоваться любые символы, кроме цифр. Запустите программу, и мы получим:

4
34
23

Предыдущая часть Следующая часть

Посещение learnbyproject.net для бесплатных Курсов регулярного выражения и других бесплатных курсов

Оригинал: “https://www.codementor.io/@seranguyen/java-regular-expression-part-7-extracting-text-with-java-util-scanner-rg1q2wpv2”