Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Оглавление
[1] Регулярные выражения [2] Цель работы: [3] Теоретическая часть [4] Основные понятия [5] Общее описание [6] Специальные символы (метасимволы)
[7]
[8] [9] Метасимволы позиционирования [10] Некоторые методы для работы с шаблонами [11] Запоминание найденных подстрок [12] Модификаторы поиска
[13] [14] Контрольные вопросы к лабораторной работе 6 |
ЛАБОРАТОРНАЯ РАБОТА № 6
Регулярные выражения это средство обработки данных. Задача, требующая замены или поиска текста, может быть достаточно просто и изящно решена с помощью регулярных выражений. И хотя максимальный эффект от регулярных выражений можно добиться при использовании серверных языков (например, PHP), всё же не стоит недооценивать возможности этого приложения и на стороне клиента.
Регулярное выражение (regular expression) средство для обработки строк или последовательность символов, определяющая шаблон текста.
Модификатор предназначен для "инструктирования" регулярного выражения.
Метасимволы специальные символы, которые служат командами языка регулярных выражений.
Регулярное выражение задаётся как обычная переменная, только вместо кавычек используется слеш, например:
var reg=/рег_выражение/
Регулярное выражение может состоять из обычных символов; в этом случае оно будет соответствовать заданной комбинации символов в строке. Например, выражение /счет/ соответствует выделенным подстрокам в следующих строках: "счетчик", "пересчет", "счеталка".
Регулярные выражения представляют собой образцы для поиска заданных комбинаций символов в текстовых строках (такой поиск называется сопоставлением с образцом). Существует два способа присваивания переменным регулярных выражений:
var re = new RegExp("pattern"[,"switch"]?).
здесь pattern - регулярное выражение, а switch - необязательные опции поиска.
Инициализаторы объекта, например, var re = /ab+c/, следует применять в тех случаях, когда значение регулярного выражения остается неизменным во время работы сценария. Такие регулярные выражения компилируются в процессе загрузки сценария и, следовательно, выполняются быстрее.
Вызов конструктора, например, var re = new RegExp("ab+c"), следует применять в тех случаях, когда значение переменной будет меняться. Если вы собираетесь использовать регулярное выражение несколько раз, то имеет смысл скомпилировать его методом compile для более эффективного поиска образцов.
Примечание: регулярное выражение не может быть пустым: два символа // подряд задают начало комментария. Поэтому для задания пустого регулярного выражения используйте выражение /.?/.
Регулярные выражения используются методами exec и test объекта RegExp и методами match, replace, search и split объекта String. Если необходимо просто проверить, содержит ли данная строка подстроку, соответствующую образцу, то используются методы test или search. Если же необходимо извлечь подстроку (или подстроки), соответствующие образцу, то используются методы exec или match. Метод replace обеспечивает поиск заданной подстроки и замены ее на другую строку, а метод split позволяет разбить строку на несколько подстрок, основываясь на регулярном выражении или обычной текстовой строке.
Под простейшими шаблонами будем понимать такие шаблоны, которые не нуждаются в каких-либо специальных символах.
Допустим, нашей задачей является замена всех букв "р" (малых и заглавных) на латинскую большую букву "R" в словосочетании Регулярные выражения.
Создаём шаблон var reg=/р/ и, используя метод replace, осуществляем задуманное
<script language="JavaScript">
var str="Регулярные выражения"
var reg=/р/
var result=str.replace(reg, "R")
document.write(result)
</script>
В результате получим строку «РегуляRные выражения», замена произошла только на первом вхождении буквы "р" с учётом регистра. Но под условия нашей задачи этот результат не подходит. Для решения задачи полностью понадобятся модификаторы "g" и "i", которые могут использоваться как отдельно, так и совместно. Эти модификаторы ставятся в конце шаблона регулярного выражения, после слэша, и имеют следующие значения:
<script language="JavaScript">
var str="Регулярные выражения"
var reg=/р/g
var result=str.replace(reg, "R")
document.write(result)
</script>
получим строку «РегуляRные выRажения».
Метасимволы задают тип символов искомой строки, способ окружения искомой строки в тексте, а так же количество символов отдельного типа в просматриваемом тексте. Поэтому метасимволы можно разделить на три группы:
\b |
Означает границу слова, позицию между словом и пробелом |
\B |
Означает границу пробела, позицию между пробелом и словом |
\c |
Совпадает с управляющем символом вида "Ctrl"+"символ" |
\d |
Любая цифра |
\D |
Любой нецифровой символ |
\f |
Символ перевода страницы |
\n |
Символ новой строки |
\r |
Символ возврата каретки |
\s |
Одиночный пустой символ, соответствует символу пробела |
\S |
Одиночный непустой символ, любой один символ за исключением пробела. |
\t |
Табуляция |
\v |
Вертикальная табуляция |
\w |
Буква, цифра или подчеркивание |
\W |
Не буква, цифра или символ подчёркивания. |
. |
Любой символ, любые знаки, буквы, цифры и т.д. (кроме \n новая строка) |
[ ] |
Набор символов, задаёт условие, при котором шаблон должен выполняться при любом совпадении символов заключенных в квадратные скобки |
[^ ] |
Набор не входящих символов, задаёт условие, при котором шаблон не должен выполняться при любом совпадении символов заключенных в квадратные скобки. |
x|y |
Соответствует x или y. |
(подвыражение) |
Ищет подвыражение и сохраняет в памяти найденную группу символов |
Например:
[xyz] - соответствует любому символу из заключенных в квадратные скобки.
[^xyz] - соответствует любому символу, кроме заключенных в квадратные скобки.
[a-z] -соответствует любому символу в указанном диапазоне.
[^a-z] -соответствует любому символу, кроме лежащих в указанном диапазоне.
* |
Означает, что предшествующий символ должен встретиться в строке ноль и большее количество раз. |
+ |
Означает, что предшествующий символ должен встретиться в строке один и большее количество раз |
? |
Означает, что предшествующий символ должен встретиться в строке ноль или один раз |
{n} |
Означает, что предшествующий символ должен встретиться в строке точно n раз |
{n, } |
Означает, что предшествующий символ должен встретиться в строке n или большее количество раз |
{n,m} |
Означает, что предшествующий символ должен встретиться в строке, по крайней мере, n раз, но не более чем m раз |
^ |
В начале строки |
$ |
В конце строки |
replace - данный метод был уже использован в самом начале, он предназначен для поиска образца и замены найденной подстроки на новую подстроку. Является методом объекта String, поэтому вызывается для строки, которая проверяется на совпадение с шаблонов. В качестве параметров передаются регулярное выражение и параметры поиска.
test - данный метод проверяет, есть ли совпадения в строке относительно шаблона и возвращает false, если сопоставление с образцом закончилось неудачей, в противном случае true. Является методом объекта RegExp, поэтому вызывается для строки, заданной в виде регулярного выражения. В качестве параметра передается строка, которая проверяется на соответствие шаблону.
Например:
<script language="JavaScript">
var str="JavaScript"
var reg=/PHP/
var result=reg.test(str)
document.write(result)
</script>
выведет в качестве результата false, т.к. строка "JavaScript" не равна строке "PHP".
Обратите внимание на то, как это все организовано. Сначала создается строка (str), которая будет проверятся на соответствие шаблону. Потом создается шаблон (reg) в виде регулярного выражения. Затем вызывается метод test регулярного выражения reg, а в качестве параметра данного метода задается проверяемая строка str, т.е. получаем конструкцию: reg.test(str). Результат работы данного теста сохраняется в переменной, например в нашем случае, result.
Также метод test может возвращать вместо true или false любую другую строку заданную программистом.
Например:
<script language="JavaScript">
var str="JavaScript"
var reg=/PHP/
var result=reg.test(str) ? "Строка совпала" : "Строка не совпала"
document.write(result)
</script>
в этом случае в качестве результата будет строка «Строка не совпала».
exec - данный метод выполняет сопоставление строки с образцом, заданным шаблоном. Является методом объекта RegExp, поэтому вызывается для строки, заданной в виде регулярного выражения. В качестве параметра передается строка, которая проверяется на соответствие шаблону.
Если сопоставление с образцом закончилось неудачей, то возвращается значение null. В противном случае результатом является массив подстрок, соответствующих заданному образцу. Причем, первый элемент массива равен исходной строке, удовлетворяющей заданному шаблону.
Например:
<script language="JavaScript">
var reg=/(\d+).(\d+).(\d+)/
var arr=reg.exec("Я родился 15.09.1980")
document.write("Дата рождения: ", arr[0], "< br>")
document.write("День рождения: ", arr[1], "< br>")
document.write("Месяц рождения: ", arr[2], "< br>")
document.write("Год рождения: ", arr[3], "< br>")
</script>
в результате получим четыре строки:
Дата рождения: 15.09.1980
День рождения: 15
Месяц рождения: 09
Год рождения: 1980
Если часть регулярного выражения заключена в круглые скобки, то соответствующая ей подстрока будет запомнена для последующего использования. Пример использования символов «круглые скобки» для запоминания подстрок и их дальнейшего использования отображен в вышеприведенном примере.
Для доступа к запомненным подстрокам используются свойства
$1, :, $9 объекта RegExp или элементы массива, возвращаемого методами exec и math. В последнем случае количество найденных и запомненных подстрок не ограничено.
Значениями свойств $1, :, $9 являются подстроки исходной строки, которые были запомнены в процессе последнего сопоставления с образцом. Регулярное выражение может содержать любое количество выражений в круглых скобках, но в объекте RegExp запоминаются только последние девять найденных соответствий.
Например следующий сценарий
var re = new RegExp("(\\d*)\\s*(\\d*)","ig");
var arr = re.exec("444 555 6666");
var s = "$1 = "" + RegExp.$1 + "" ";
s += "$2 = "" + RegExp.$2 + "" ";
s += "$3 = "" + RegExp.$3 + """;
document.write(s);
выведет на экран браузера текст $1 = "444" $2 = "555" $3 = "".
Кроме того, для доступа к запомненным подстрокам используются свойства
$01, :, $99 объекта RegExp . Значениями свойств $01, :, $99 являются подстроки исходной строки, которые были запомнены в процессе последнего сопоставления с образцом. Регулярное выражение может содержать любое количество выражений в круглых скобках, но в этих свойствах запоминаются только последние 99 найденных соответствий.
Пример: следующий сценарий
var re = new RegExp("(\\d*)\\s*(\\d*)","ig");
var arr = re.exec("444 555 6666");
var s = "$01 = "" + RegExp.$01 + "" ";
s += "$02 = "" + RegExp.$02 + "" ";
s += "$03 = "" + RegExp.$03 + """;
document.write(s);
выведет на экран обозревателя текст $01 = "444" $02 = "555" $03 = "".
Следующий сценарий использует метод replace для перестановки слов в строке. Для замены найденного текста используются свойства $1 и $2 соответственно первое и второе слово в рассматриваемой строке.
<script language="JavaScript">
var re = /(\w+)\s(\w+)/;
var str = "Михаил Булгаков";
document.write(str.replace(re, "$2, $1"))
</script>
Этот сценарий выведет в окно обозревателя текст: Булгаков, Михаил
Еще пример:
/(\w+)@({\w\._}+)/
Данное выражение ищет любой адрес электронной почты, разбивая его на две части: имя почтового ящика и имя сервера, и сохраняет их в памяти в виде групп символов под номерами 1 и 2.
При создании регулярного выражения можно указать дополнительные опции поиска:
i (ignore case). |
Не различать строчные и прописные буквы |
g (global search) |
Глобальный поиск всех вхождений образца |
m (multiline). |
Многострочный поиск. |
Можно использовать любые комбинации этих трех опций, например, ig или gim.
Приведем еще несколько примеров. Обратите внимание на пример формирования результирующей строки!
Регулярные выражения различают строчные и прописные буквы, поэтому следующий сценарий
var s = "Изучаем язык JavaScript";
var re = /JAVA/;
var result = re.test(s) ? "" " : "" не ";
document.write("Строка "" + s + result + "соответствует образцу " + re);
выведет в окно обозревателя текст:
Строка "Изучаем язык JavaScript" не соответствует образцу /JAVA/
Если теперь заменим вторую строку примера на var re = /JAVA/i;, то на экран будет выведен текст:
Строка "Изучаем язык JavaScript" соответствует образцу /JAVA/i
Теперь рассмотрим опцию глобального поиска. Она обычно применяется методом replace при поиске образца и замены найденной подстроки на новую. Дело в том, что по умолчанию этот метод производит замену только первой найденной подстроки и возвращает полученный результат. Рассмотрим следующий сценарий:
var s = "Мы пишем сценарии на JavaScript, " +
"но JavaScript - не единственный сценарный язык.";
var re = /JavaScript/;
document.write(s.replace(re, "VBScript"));
Он выводит в окно обозревателя текст, который явно не соответствует желаемому результату:
Мы пишем сценарии на VBScript, но JavaScript - не единственный сценарный язык.
Для того, чтобы все вхождения строки "JavaScript" были заменены на "VBScript", необходимо изменить значение регулярного выражения на var re = /JavaScript/g;. Тогда результирующая строка будет иметь вид:
Мы пишем сценарии на VBScript, но VBScript - не единственный сценарный язык.
Наконец, опция многострочного поиска позволяет проводить сопоставление с образцом строкового выражения, состоящего из нескольких строк текста, соединенных символами разрыва строки. По умолчанию, сопоставление с образцом прекращается, если найден символ разрыва строки. Данная опция преодолевает указанное ограничение и обеспечивает поиск образца по всей исходной строке. Она также влияет на интерпретацию некоторых специальных символов в регулярных выражениях, а именно: обычно символ ^ сопоставляется только с первым элементом строки. Если же опция многострочного поиска включена, то он также сопоставляется с любым элементом строки, которому предшествует символ разрыва строки. Обычно символ $ сопоставляется только с последним элементом строки. Если же опция многострочного поиска включена, то он также сопоставляется с любым элементом строки, который является символом разрыва строки.
В заключении отметим, в данной лабораторной работе отображены далеко не все возможности регулярных выражений. Для более глубокого изучения этого вопроса необходимо более подробно изучить объект RegExp.
Используя теоретическую часть, отобразите в Вашем документе следующее:
Фамилия: |
|
Имя: |
|
Отчество: |
Следующие индивидуальные задания выполняются в группе по вариантам