Javascript, регулярное выражение: примеры, проверка регулярных выражений. Регулярные выражения Regexp спецсимволы
Регулярные выражения - одно из самых мощных средств обработки данных в 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] | Соответствует любому символу, кроме заключенных в квадратные скобки. |
Соответствует любому символу в указанном диапазоне. | |
[^a-z] | Соответствует любому символу, кроме лежащих в указанном диапазоне. |
\b | Соответствует границе слова, т. е. позиции между словом и пробелом или переводом строки. |
\B | Соответствует любой позиции, кроме границе слова. |
\сX | Соответствует символу Ctrl+X. Например, /\cI/ эквивалентно /\t/ |
\d | Соответствует цифре. Эквивалентно . |
\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 | Соответствует латинской букве, цифре или подчеркиванию. Эквивалентно / /. |
\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()
var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.test(sample) ? "" " : "" не "; document.write("Строка "" + sample + result + "соответствует образцу " + re);
Пример использования метода exec()
var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.exec(sample); document.write("Найдено совпадение: "" + result + """);
А в этом примере мы воспользуемся альтернативным способом создания объекта RegExp:
var sample = "Из апельсинов делают апельсиновый сок"; var result = /апельсин*/.test(sample) ? "" " : "" не "; document.write("Строка "" + sample + result + "соответствует образцу ");
Следующий пример - реально действующий скрипт. Он позволяет избавиться от бага с отображением прозрачности PNG-картинок в Internet Explorer версии 5 и 6. Этот скрипт уже упоминался нами при рассмотрении слоёв и их применения в JavaScript.
Function correctPNG() { // проверяем строку подписи браузера пользователя if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) { for(var i=0; i