русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Регулярные выражения в JavaScript


Дата добавления: 2015-07-09; просмотров: 806; Нарушение авторских прав


http://www.on-line-teaching.com/js/js.regexp.htm

Регулярные выражения - одно из самых мощных средств обработки данных в JavaScript. Кроме того, это самый удобный способ обработки данных в случаях, когда точный шаблон поиска задать невозможно. Простейший пример - надо выделить в тексте все адреса электронной почты и номера телефонов. Очевидно, что простым поиском подстроки обойтись не удастся, т.к. мы заранее не знаем какие именно адреса и телефоны встетятся в тексте.

Регулярные выражения оперируют не точными значениями, а шаблонами. Шаблон (pattern) записывается при помощи языка регулярных выражений и с его основами мы сейчас познакомимся.

Итак, любое регулярное выражение состоит из разделителя, тела шаблона и модификаторов (иногда их ещё называют переключателями, switches).

/pattern/switch

Здесь "/" - это разделитель, "pattern" - тело шаблона, а "switch" - модификаторы.

В JavaScript возможно всего два пути использования регулярных выражений: с помощью методов объекта RegExp или с помощью методов объекта String.

Экземпляр объекта RegExp может создаваться двумя способами - явным и косвенным:

// явный способvar re = new RegExp("pattern", "switch"); // косвенный (альтернативный) способvar re = /pattern/switch;

Обратите внимание, что при косвенном способе шаблон задаётся БЕЗ кавычек.

Любое регулярное выражение состоит из обычных символов, спецсимволов и квантификаторов повторения. В качестве обычных символов выступают буквы, цифры и символьные знаки, при этом в качестве символов можно использовать национальные символы и символы в Unicode. Внимание! "Пробел" в регулярных выражениях тоже считается значимым, поэтому будьте очень внимательны при добавлении пробелов в выражение. А лучше воспользуйтесь специальным метасимволом (смотрите символ \s в таблице ниже).



Спецсимволы (или Метасимволы) - это основа регулярных выражений, т.к. именно спецсимволы определяют порядок поиска и указывают интерпретатору выражения на дополнительные условия и ограничения. В таблице приведены основные спецсимволы и дано их краткое описание.

Спецсимвол Соответствие в шаблоне
\ Для символов, которые обычно трактуются буквально, означает, что следующий символ является специальным. Например, /n/ соответствует букве n, а /\n/ соответствует символу перевода строки. Для символов, которые обычно трактуются как специальные, означает, что символ должен пониматься буквально. Например, /^/ означает начало строки, а /\^/ соответствует просто символу ^. /\\/ соответствует обратной косой черте \.
^ Соответствует началу строки.
$ Соответствует концу строки.
(pattern) Соответствует строке pattern и запоминает найденное соответствие.
(?:pattern) Соответствует строке pattern, но не запоминает найденное соответствие. Используется для группировки частей образца, например, /ко(?:т|шка)/ — это краткая запись выражения /кот|кошка/.
(?=pattern) Соответствие с "заглядыванием вперед", происходит при соответствии строки pattern без запоминания найденного соответствия. Например, /Windows (?=95|98|NT|2000)/ соответствует "Windows " в строке "Windows 98", но не соответствует в строке "Windows 3.1". После сопоставления поиск продолжается с позиции, следующей за найденным соответствием, без учета заглядывания вперед.
(?!pattern) Соответствие с "заглядыванием вперед", происходит при несоответствии строки pattern без запоминания найденного соответствия. Например, /Windows (?!95|98|NT|2000)/ соответствует "Windows " в строке "Windows 3.1", но не соответствует в строке "Windows 98". После сопоставления поиск продолжается с позиции, следующей за найденным соответствием, без учета заглядывания вперед.
x|y Соответствует x или y.
[xyz] Соответствует любому символу из заключенных в квадратные скобки.
[^xyz] Соответствует любому символу, кроме заключенных в квадратные скобки.
[a-z] Соответствует любому символу в указанном диапазоне.
[^a-z] Соответствует любому символу, кроме лежащих в указанном диапазоне.
\b Соответствует границе слова, т. е. позиции между словом и пробелом или переводом строки.
\B Соответствует любой позиции, кроме границе слова.
\сX Соответствует символу Ctrl+X. Например, /\cI/ эквивалентно /\t/
\d Соответствует цифре. Эквивалентно [0-9].
\D Соответствует нецифровому символу. Эквивалентно [^0-9].
\f Соответствует символу перевода формата (FF).
\n Соответствует символу перевода строки (LF).
\r Соответствует символу возврата каретки (CR).
\s Соответствует символу пробела. Эквивалентно /[ \f\n\r\t\v]/.
\S Соответствует любому непробельному символу. Эквивалентно /[^ \f\n\r\t\v]/.
\t Соответствует символу табуляции (HT).
\v Соответствует символу вертикальной табуляции (VT).
\w Соответствует латинской букве, цифре или подчеркиванию. Эквивалентно /[A-Za-z0-9_] /.
\W Соответствует любому символу, кроме латинской буквы, цифры или подчеркивания. Эквивалентно /[^A-Za-z0-9_] /.
\n n — положительное число. Соответствует n-ной запомненной подстроке. Вычисляется путем подсчета левых круглых скобок. Если левых скобок до этого символа меньше, чем n, то эквивалентно \0n.
\0n n — восьмеричное число, не большее 377. Соответствует символу с восьмеричным кодом n. Например, /\011/ эквивалентно /\t/.
\xn n — шестнадцатеричное число, состоящее из двух цифр. Соответствует символу с шестнадцатеричным кодом n. Например, /\x31/ эквивалентно /1/.
\un n — шестнадцатеричное число, состоящее из четырех цифр. Соответствует символу Unicode с шестнадцатеричным кодом n. Например, /\u00A9/ эквивалентно /©/.
. Точка. Соответствует любому символу.

Спецсимволов достаточно много и с их помощью можно описать практически любые словосочетания или поисковые фразы.

Вторая составляющая шаблона - квантификаторы. Это подмножество спецсимволов, задающее условие повторения символов или их групп. Квантификатор записывается справа от выражения и распространяется на ближайший символ или группу. Например:

(pattern_1)|(pattern_2){quont}

Здесь квантификатор "quont" относитcя только к "pattern_2".

В таблице приведены все основные квантификаторы:

Квантификатор Соответствие в шаблоне
* Соответствует повторению предыдущего символа нуль или более раз.
+ Соответствует повторению предыдущего символа один или более раз.
? Соответствует повторению предыдущего символа нуль или один раз. . Соответствует любому символу, кроме символа новой строки.
{n} n — неотрицательное число. Соответствует ровно n вхождениям предыдущего символа.
{n,} n — неотрицательное число. Соответствует n или более вхождениям предыдущего символа. /x{1,}/ эквивалентно /x+/. /x{0,}/ эквивалентно /x*/.
{n,m} n и m — неотрицательное числа. Соответствует не менее чем n и не более чем m вхождениям предыдущего символа. /x{0,1}/ эквивалентно /x?/.

Итак, с основами языка регулярных выражений мы познакомились и теперь опробуем новые знания на практике. Вот пример использования метода test()

<script type="text/javascript"> var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.test(sample) ? "' " : "' не "; document.write("Строка '" + sample + result + "соответствует образцу " + re);</script>

var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.test(sample) ? "' " : "' не "; document.write("Строка '" + sample + result + "соответствует образцу " + re); Строка 'Из апельсинов делают апельсиновый сок' соответствует образцу /апельсин*/

Пример использования метода exec()

<script type="text/javascript"> var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.exec(sample); document.write("Найдено совпадение: '" + result[0] + "'"); </script>

var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин+/; var result = re.exec(sample); document.write("Найдено совпадение: '" + result[0] + "'"); Найдено совпадение: 'апельсин'

А в этом примере мы воспользуемся альтернативным способом создания объекта RegExp:

<script type="text/javascript"> var sample = "Из апельсинов делают апельсиновый сок"; var result = /апельсин*/.test(sample) ? "' " : "' не "; document.write("Строка '" + sample + result + "соответствует образцу ");</script>

Следующий пример - реально действующий скрипт. Он позволяет избавиться от бага с отображением прозрачности PNG-картинок в Internet Explorer версии 5 и 6. Этот скрипт уже упоминался нами при рассмотрении слоёв и их применения в JavaScript.

function correctPNG(){ // проверяем строку подписи браузера пользователя if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) { for(var i=0; i<document.images.length; i++) { var img = document.images[i]; var imgName = img.src.toUpperCase(); if (imgName.substring(imgName.length-3, imgName.length) == "PNG") { var imgID = (img.id) ? "id='" + img.id + "' " : "" var imgClass = (img.className) ? " class='" + img.className + "' " : "" var imgTitle = (img.title) ? " title='" + img.title + "' " : "title='" + img.alt + "' " var imgStyle = "display:block;" + img.style.cssText if (img.align == "left") imgStyle = "float:left;" + imgStyle if (img.align == "right") imgStyle = "float:right;" + imgStyle if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle var strNewHTML = "<span " + imgID + imgClass + imgTitle + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";" + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader" + "(src=\'" + img.src + "\', sizingMethod='crop');\"></span>" img.outerHTML = strNewHTML i = i-1 } } }} window.attachEvent("onload", correctPNG);

Здесь мы используем регулярные выражения для проверки того, что скрипт выполняется в IE нужных нам версий. Если проверка не удалась - значит дополнительная обработка не требуется и можно просто завершить скрипт.

Конструкция

/MSIE (5\.5|6).+Win/.test(navigator.userAgent)

читается так: "проверить, соответствует ли строка, содержащаяся в свойстве navigator.userAgent, следующиему шаблону: Строка MSIE, после которой стоит пробел, затем наборы символов "5.5" или "6", после которых один или более символов, за которыми следует набор символов "Win"".

Мы рассмотрели здесь лишь наиболее используемые функции. Более подробный список вы легко сможете найти в Интернет. Регулярные выражения - очень мощное средство, но не лишенное недостатков. И главный из них - производительность. Разбор, компиляция и поиск в тексте по шаблону значительно более затратная операция, нежели простой поиск на точное соответствие. Поэтому не стоит впадать в крайности и использовать регулярные выражения для точного поиска.

 



<== предыдущая лекция | следующая лекция ==>
Прокрутка | 


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.062 сек.