Применение StringTokenizer для лексического анализа строк в Java

Java

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

Класс StringTokenizer, входящий в пакет java.util, обеспечивает возможность разбиения строки на отдельные лексемы, используя определенный набор разделителей.

При использовании StringTokenizer необходимо задать входную строку и набор разделителей в виде символьной строки. Каждый отдельный символ в строке разделителей рассматривается как самостоятельный разделитель. Например задание строки разделителей в виде «.,!» означает, что в качестве разделителя может использоваться точка, запятая или восклицательный знак.

Конструкторы класса StringTokenizer :

  • StringTokenizer(String str)
  • StringTokenizer(String str, String delim)
  • StringTokenizer(String str, String delim, boolean returnDelims)

str — разделяемая на лексемы строка, delim — набор разделителей, returnDelims — возвращать ли символы разделители в виде отдельных лексем (по умолчанию не возвращаются).

В качестве разделителей по умолчанию (при использовании первой формы конструктора) используется набор пробельных символов: пробел, знак табуляции, перевод строки и возврат каретки. т.е. " \t\n\r\f"

Класс StringTokenizer реализует интерфейс Enumeration, т.е. в нем реализованы методы boolean hasMoreElements() и Object nextElement(). Они выполняют абсолютно то же, что и два других метода класса, имеющие более информативные названия: boolean hasMoreTokens() и String nextToken().

Методы StringTokenizer :

  • int countTokens() — количество лексем оставшихся в анализируемой строке.
  • boolean hasMoreElements() или boolean hasMoreTokens() — есть ли в разбираемой строке еще лексемы?
  • Object nextElement() или String nextToken() — возвращает следующую лексему в виде объекта типа Object или String соответственно.
  • String nextToken(String delim) — переключает набор разделителей на новый, после чего возвращает следующую лексему начиная с текущей позиции. Новый набор разделителей остается для дальнейшего разбора.

ПРИМЕР 1

import java.util.StringTokenizer;

public class StringTokenizerExample_1 {

	static String str = "Пример использования StringTokenizer для разбора строки на лексемы.";
	
	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer(str, " .");
		
		int i = 1;
		while(st.hasMoreTokens()) {
			System.out.println((i++)+" "+st.nextToken());
		}
	}

}

Результат работы

1 Пример
2 использования
3 StringTokenizer
4 для
5 разбора
6 строки
7 на
8 лексемы

ПРИМЕР 2

import java.util.StringTokenizer;

public class StringTokenizerExample_2 {

	static String str = "Имя:Иван|Фамилия:Иванов|E-Mail:Ivanov@mail.ru";
	
	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer(str, ":|");
		
		while(st.hasMoreTokens()) {
			System.out.println(st.nextToken()+" - "+st.nextToken());
		}
	}

}

Результат работы

Имя - Иван
Фамилия - Иванов
E-Mail - Ivanov@mail.ru

Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий