
- •По курсу «Интернет-программирование»
- •Принципы работы регулярных выражений
- •История развития регулярных выражений
- •Принципы регулярных выражений
- •Конструкции шаблонов регулярных выражений
- •Классы символов (диапазоны)
- •Квантификаторы (повторения)
- •Граничные метасимволы
- •Перечисления
- •Группировки
- •Утверждения
- •Условные подвыражения
- •Реализация регулярных выражений в языках программирования
- •Примеры
Примеры
JavaScript
Код 1. Различие в выполнении exec и match
<script>
str = "vuz Miet\n\ris best Miet";
var mRe = /MIET/gim;
alert(mRe.exec(str)); // Miet
alert(str.match(mRe)); // Miet, Miet
</script>
Код 2. Замена с подстановкой из группировки
<script>
str = "The Miet\n\ris best vuz in Moscow";
alert(str.replace(/(M[^\s]+)/gim, "$1"+" (Zelenograd)"));
/*
The Miet (Zelenograd)
is best vuz in Moscow (Zelenograd)
*/
</script>
PHP
Код 3. Использование preg_match_all и preg_replace_callback
<?
$str = "The Miet\n\ris best Miet";
preg_match_all("/MIET/im", $str, $result );
echo "<pre>"; print_r($result); echo "</pre>";
/*
Array
(
[0] => Array
(
[0] => Miet
[1] => Miet
)
)
*/
$result = preg_replace_callback("/MIET/im", "changeVuz", $str);
function changeVuz($temp) {
//$temp массив из одного элемента
return strtoupper($temp[0]);
}
echo "<pre>"; print_r($result); echo "</pre>";
/*
The MIET
is best MIET
*/
?>
Код 4. Замена с проверкой предусловия
<?
$str = "The Miet is best vuz in Zelenograd. Address: Moscow Zelenograd";
$result = preg_replace("/(?<!Moscow\s)Zelenograd/", "Moscow", $str);
echo $result; // The Miet is best vuz in Moscow. Address: Moscow Zelenograd
/?>
Java
Код 5. Программа для тестирования работы регулярных выражений
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;
public class JavaTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Введите шаблон");
Pattern pattern = Pattern.compile(scan.nextLine());
System.out.println("Введите строку");
Matcher matcher = pattern.matcher(scan.nextLine());
while (matcher.find()) {
System.out.println(
"Найден текст " + matcher.group()
+ " позиция старта "+matcher.start()
+ " позиция окончания "+matcher.end());
}
}
}
//Выполнение
Введите шаблон
[0-9]+
Введите строку
we435we
Найден текст 435 позиция старта 2 позиция окончания 5
Задание на лабораторную работу
Для выбранного языка (JavaScript, PHP или Java) реализовать проверки и замены с использованием регулярных выражений в соответствии с вариантом и/или заданием преподавателя.
1 |
Реализовать несколько вариантов проверки телефонного номера, чтобы срабатывало для случаев от +x (xxx) xxx-xx-xx, до xxxxxxxxxx, где x-цифры
Сравнить производительность разных решений путем запуска генерации номеров и проверки их в цикле с записью общего времени выполнения обработки*. |
2 |
Реализовать парсинг получаемого объекта вида {n:v,n:v, и т. д.}, где n – ключ, например name, а v – значение, например Miet. Количество пар ключ-значение не ограничено. если ключ содержит слово name, то валидное value может содержать только буквы русского и латинского алфавитов, пробел и знак подчеркивания. Если ключ равен слову index, то валидное value должно содержать только цифры.
В результате при отсутствии ошибок должен выдаваться одномерный ассоциативный массив ключ-значение, а при наличии ошибок вместо значение в массив напротив ключа, значение которого содержит ошибку должно записываться сообщение об ошибке. |
3 |
Реализовать парсинг HTML текста (например, главной страницы miet.ru) с выборкой в массив всех ссылок в виде пар: ключ=значение, где ключ это url без протокола и параметров GET (т.е. без ?x=y и т. д.), а значение — массив из трех полей: содержимое тега title ссылки (если он есть), содержимое между тегами <а ...></a> и полный URL.
Примерный вид результата:
miet.ru/about → url → miet.ru/about/?authorisation=true, title → “”, body → “Авторизация” miet.ru/study -> url → miet.ru/study/, title → “Обучение”, body → “Программа обучения в институте” и т.д. |
* - методы определения времени:
JavaScript |
Получить текущую дату - var start = new Date(); Получить число миллисекунд текущей даты — start.getTime(); Количество миллисекунд отсчитывается от 1 января 1970 г. |
PHP |
Функция microtime() возвращает строку вида: "msec sec", где sec - это количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT), а msec - это дробная часть. Функция microtime(true) возвращает число вида sec.msec |
Java |
System.currentTimeMillis() - возвращает миллисекунды System.nanoTime() - возвращает наносекунды |
Контрольные вопросы:
Что такое регулярное выражение?
Что такое шаблон в регулярном выражении?
Что такое классы сиволов? Приведите примеры.
Что такое квантификаторы? Приведите примеры.
Что такое группировки? Приведите примеры.
Что такое метасимволы? Приведите примеры.
Что такое перечисления? Приведите примеры.
Что такое утверждения? Приведите примеры.
Что такое граничные метасимволы? Приведите примеры.
Что такое флаги? Приведите примеры.
Какие инструменты для работы с регулярными выражениями есть в JavaScript?
Какие инструменты для работы с регулярными выражениями есть в PHP?
Какие инструменты для работы с регулярными выражениями есть в Java?
Можно ли при замене использовать функцию? Приведите примеры.