Обработка текста зачастую предполагает синтаксический анализ или разбор форматированной входной строки. Синтаксический анализ подразумевает разделение текста на ряд отдельных частей, так называемых лексем, которые способны передать в определенной последовательности некоторое семантическое значение.
Класс StringTokenizer обеспечивает первую стадию процесса синтаксического анализа, и поэтому его зачастую называют лексическuм анализатором или просто сканером. Этот класс реализует интерфейс Enumeration. Таким образом, задав входную строку, средствами класса StringTokenizer можно перечислить содержащиеся в ней отдельные лексемы.
Чтобы воспользоваться классом StringTokenizer, следует указать входную и символьную строку, содержащую разделители. Разделители это символы, разделяющие лексемы.
Каждый символ в символьной строке разделителей рассматривается как допустимый разделитель. Например, символьная строка «,;:» устанавливает в качестве разделителей запятую, точку с запятой и двоеточие. Набор разделителей, выбираемых по умолчанию, состоит из пробельных символов: пробела, знака табуляции, перевода строки и возврата каретки.
Ниже приведены конструкторы класса StringTokenizer.
1 2 3 |
StringTokenizer(String строка) StringTokenizer(String строка, String разделители) StringTokenizer(String строка, String разделители, boolean разделитель_как_лексема) |
Во всех трех формах конструктора параметр строка обозначает разделяемую на лексемы символьную строку. В первой форме используются разделители по умолчанию, во второй и в третьей формах параметр разделители обозначает символьную строку, задающую разделители.
В третьей форме разделители возвращаются в качестве отдельных лексем при синтаксическом анализе символьной строки, если параметр разделитель_как_лексема принимает логическое значение true. В противном случае разделители не возвращаются. Разделители не возвращаются и в первых двух формах конструктора данного класса.
Как только объект класса StringTokenizer будет создан, можно вызвать его метод nextToken(), чтобы извлечь последовательные лексемы.
Метод hasMoreTokens() возвращает логическое значение true до тех пор, пока для извлечения еще имеются лексемы.
А поскольку класс StringTokenizer реализует интерфейс Enumeration, то его методы hasMoreElements() и nextElement() также реализованы и действуют точно так же, как и методы hasMoreTokens() и nextToken() соответственно. Методы из класса StringTokenizer перечислены ниже:
- int countTokens() — используя текущий набор разделителей, определяет количество лексем, которые осталось разобрать и возвратить в качестве результата
- boolean hasМoreElements() — возвращает логическое значение true, если в символьной строке остается одна лексема или больше, а иначе — логическое значение false
- boolean hasМoreTokens() — возвращает логическое значение true, если в символьной строке остается одна лексема или больше, а иначе — логическое значение false
- Object nextElement() — возвращает следующую лексему в виде объекта типа Object
- String nextToken() — возвращает следующую лексему в виде объекта типа String
- String nextToken(String разделители) — возвращает следующую лексему в виде объекта типа Object и задает символьную строку разделителей в соответствии со значением параметра разделители
Ниже приведен пример программы, в которой объект класса StringTokenizer создается для синтаксического анализа пар «ключ-значение». Последовательный ряд пар «ключ-значение» разделяется точкой с запятой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Продемонстрируем применение класса StringTokenizer import java.util.StringTokenizer; class STDemo { static String in = "Название=Учим Java с нуля;" + "Автора=Pro-java.ru;" + "Издательство=Javadocdoc;" + "Авторское право=2017"; public static void main(String args[]) { StringTokenizer st = new StringTokenizer(in, "=;"); while(st.hasMoreTokens()) { String key = st.nextToken(); String val = st.nextToken(); System.out.println(key + " : " + val); } } } |
Эта программа выводит следующий результат:
1 2 3 4 |
Название : Учим Java с нуля Автора : Pro-java.ru Издательство : Javadocdoc Авторское право : 2017 |