HTML, Excel, Word, SEOОсновы JavaScript ⇒ Регулярные выражения в JavaScript

ОСНОВЫ JavaScript

Учебник JavaScript
·Знакомство с JS. Переменные, операторы, операции
·Функции
·Модель HTML документа
·Иерархия документов в бразуере
·Формы
·Окна и фреймы
·Ссылки, заголовок, статус
·События
·События клавиатуры и мыши
·События. Таймер
·Стили. Управление стилями
·Слои и блоки. Управление видимостью
·Объекты JS
·Внешние объекты
·Внутренние объекты
·Массивы
·Регулярные выражения
·Математика в JS
·Пример простого калькулятора
·Дата и время
·Cookies и хранение состояния
·Немного об AJAX
·Работа с WebMoney

 

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


Автор: Артемьев Сергей Игоревич ICQ: 438856621 email: _spin_@bk.ru


Регулярные выражения - одно из самых мощных средств обработки данных в 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>

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

 <script type="text/javascript">

	var sample = "Из апельсинов делают апельсиновый сок";
	var re = /апельсин*/;

	var result = re.exec(sample);

	document.write("Найдено совпадение: '" + result[0] + "'");

</script>

А в этом примере мы воспользуемся альтернативным способом создания объекта 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"".

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



В начало страницы



В начало страницы