Java : работа со строками
Тема занятия Простой поиск в строках: методы indexOf(), charAt(), matches(); Классы String, StringBuffer, StringBuilder; Выделение значащих элементов в строках: классы StringTokenizer, StreamTokenizer; Регулярные выражения: пакет java.util.regex.
Простой поиск в строках String s = Hello world!; int i = s.indexOf( w ); int j = s.indexOf( l, 5 ); //Вывод: Hello System.out.println( s.substring( 0, i ) ); //Вывод: ld! System.out.println( s.substring( j ) );
Простой поиск в строке String s = Hello world!; char toFind = o; int occCount = 0; for( int i = 0; i < s.length(); i++ ){ if( s.charAt(i) == toFind ) occCount++; } //Вывод: Char o found 2 times System.out.println( Char + toFind + found + occCount + times );
Методы класса String на основе классов java.util.regex boolean matches( String regexp ); String s = Hello world!; boolean bResult = s.matches(Hello.*); Аналог вызова: bResult = Pattern.matches( regexp, s ); String replaceAll( String regexp, String newString ); String s = Hello world!.replaceAll(Hello, great); Аналог вызова: String s = Pattern.compile(regexp).matcher(s).replaceAll(newString);
Классы String, StringBuffer, StringBuilder String s = a + b; StringBuffer sb = new StringBuffer(); sb.append( a ); sb.append( b ); StringBuilder эффективнее по быстродействию, но не позволяет работать с несколькими потоками.
Разбор строк Класс StringTokenizer Конструктор: public StringTokenizer( String str, String delim, boolean returnDelim ); Признак наличия элементов: boolean hasMoreTokens(); Выбрать следующий элемент: String nextToken();
String s = index.jsp?q=1&w=2&e=3&r=4; StringTokenizer st = new StringTokenizer( s, ?=&, true ); while( st.hasMoreTokens() ){ String token = st.nextToken(); System.out.println( token ); } StringTokenizer - пример Вывод: Index.jsp ? q = 1 & …
Класс StreamTokenizer Преимущества: -разбор комментариев; -разбор чисел; -подсчет строк (метод lineno()) -классификация символов по категориям: -буквенные символы; -числа (хранятся как double); -переносы строк; -конец файла (строки); -терминальные символы.
StreamTokenizer - пример StreamTokenizer st = new StreamTokenizer( new StringReader(s) ); st.resetSyntax(); st.wordChars('a', 'z'); st.wordChars('A', 'Z'); st.wordChars('0', '9'); st.wordChars('.', '.'); st.ordinaryChar('?'); st.ordinaryChar('='); st.ordinaryChar('&'); try{ while( st.ttype != StreamTokenizer.TT_EOF ){ st.nextToken(); if( st.ttype == StreamTokenizer.TT_WORD ) System.out.println( st.sval ); else if( st.ttype == StreamTokenizer.TT_NUMBER ) System.out.println( st.nval ); else if( st.ttype == '=' || st.ttype == '?' || st.ttype == '&' ) System.out.println( (char)st.ttype ); } }catch( IOException exc ){ exc.printStackTrace(); } Вывод: index.jsp ? q = 1 & …
Регулярные выражения Пакет java.util.regex Класс Pattern – используется для подготовки и хранения регулярного выражения в скомпилированном виде. Класс Matcher – используется для поиска и замены в строках на основе скомпилированного регулярного выражения. Синтаксис, поддерживаемый классами java.util.regex:
Шаблоны последовательностей в регулярных выражениях Шаблон Значение.Любой символ \d Число (аналогично выражению [0- 9]) \DНе число (аналогично выражению [^0-9]) \s Символы-пробелы (аналогично [\t\n\x0B\f\r]) \SНе пробелы ([^\s]) \w Буквенные символы и числа ([a-zA- Z0-9]) \WПоследовательности не относящиеся к буквенным символам и числам ([^\w])
Указание количества повторений Синтаксис Значение X?Выражение X встречается один раз или не встречается вообще. X*Выражение X встречается 0 и более раз X+Выражение X встречается 1 или более раз X{n}Выражение X встречается n раз X{n,}Выражение X встречается как минимум n раз X{n,m}Выражение X встречается минимум n и максимум m раз
Проверка границ выражений Выражение Значение ^Начало строки $Конец строки \b\b Граница слова \BПоследовательность внутри слова (не на границе) \AНачало последовательности \GМесто окончания предыдущего совпадения \Z\ZОкончание последовательности, кроме завершающего символа (напр. «конец файла») \z Окончание последовательности
Регулярные выражения - примеры //bResult = true boolean bResult = "hello world".matches("\\w+\\s\\w+"); //s = Hello hello hello String s = Helllllo helo helllo.replaceAll( [l]{1}|[l]{2,}, ll ); ); // = String ListLine = String = ListLine.replaceAll( \\A, );
Задание 1 Разработать программу для сравнения производительности формирования символьного буфера из символов с использованием: -конкатенации строк; -класса StringBuffer; -класса StringBuilder.
Задание 2 Разработать программу, проверяющую корректность указания URL для ftp-сервера. Формат URL следующий: Для проверки использовать регулярные выражения.