Несколько символов или символьных классов можно сгруппировать в квадратные скобки […] Такая группировка означает «искать любой символ из указанных в […]».
Например, [еао] означает любой символ из этих трёх: 'а', 'е', или 'о'.
Например:
alert( "Гоп-стоп".match( /[гт]оп/gi ) ); // "Гоп", "топ"
Несмотря на то, что в квадратных скобках несколько символов, ищется только один. Поэтому в примере ниже нет совпадений:
alert( "Вуаля".match( /В[уа]ля/ ); // совпадений нет
Было бы совпадение в строке Вуля или Валя.
Квадратные скобки могут также содержать диапазоны символов.
Например, [a-z] — произвольный символ от a до z, [0-5] — цифра от 0 до 5.
// найдёт "xAF", но не "xce" (из Exception) alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) );
В слове Exception есть сочетание xce, но оно не подходит, потому что буквы в нём маленькие, а в диапазоне — большие.
Скобки [0-9A-F] в регулярном выражении выше означают любой символ из диапазонов 0-9 или A-F.
В квадратных скобках могут быть одновременно диапазоны, символы и символьные классы, в любом сочетании.
Символьные классы — всего лишь более короткие записи для диапазонов, в частности:
- \d — то же самое, что
[0-9], - \w — то же самое, что
[a-zA-Z0-9_], - \s — то же самое, что
[\t\n\v\f\r ]плюс несколько юникодных пробельных символов.
Кроме обычных, существуют также исключающие диапазоны: [^…].
Квадратные скобки, начинающиеся со знака каретки: [^…] находят любой символ, кроме указанных.
Например:
[^аеуо]— любой символ, кроме'a','e','o','u'[^0-9]— любая не-цифра, то же что\D[^\s]— любой не-пробельный символ, как и\S
В них, как и в обычных скобках, могут использоваться несколько символов и диапазонов.
Пример ниже ищет любые символы, кроме букв, цифр и пробелов:
alert( "alice15@gmail.com".match( /[^\d\sA-Z]/gi ) ); // "@", "."
Найдет ли регэксп /Java[^script]/ что-нибудь в строке Java?
А в строке JavaScript?
Ответы: нет, да.
- В строке
Javaон ничего не найдёт, так как исключающие квадратные скобки вJava[^...]означают «один символ, кроме указанных». А после"Java"— конец строки, символов больше нет.alert( "Java".match(/Java[^script]/) ); // нет совпадений
- Да, найдёт. Поскольку регэксп регистрозависим, то под
[^script]вполне подходит символ"S".alert( "JavaScript".match(/Java[^script]/) ); // "JavaS"
Большинство специальных символов можно использовать в квадратных скобках без экранирования.
Нужно обязательно экранировать только закрывающую квадратную скобку ']' и обратный слэш '\'. Другие специальные символы нужно экранировать только если они могут иметь особый смысл:
- Дефис
'-'экранируется только если он между других символов. Если дефис является первым или последним символом, тогда он точно не обозначает диапазон, поэтому воспринимается как обычный символ:[-…]. - Символ каретки
'^'нужно экранировать, если он в начале скобок:[\^..]. - Все остальные символы, включая точку
'.', плюс'+', круглые скобки'( )', открывающую квадратную скобку'['в экранировании не нуждаются.
Например, регэксп [-().^] ищет один из символов -().^. В данном контексте эти символы не являются специальными.
var re = /[-().^]/g; alert( "f(g)-^1".match(re) ); // найдёт (, ), -, ^
Без лишних слэшей регэксп становится короче и более читаемым. Однако, если вы их всё же поставите — вреда не будет:
var re = /[\-\(\)\.\^]/g; alert( "f(g)-^1".match(re) ); // тоже работает: (, ), -, ^
Время может быть в формате часы:минуты или часы-минуты. И часы и минуты состоят из двух цифр, например 09:00, 21-30.
Напишите регулярное выражение для поиска времени:
var re = /ваше выражение/; alert( "Завтрак в 09:00. Обед - в 21-30".match(re) ); // 09:00, 21-30
Ответ: \d\d[-:]\d\d.
var re = /\d\d[-:]\d\d/g; alert( "Завтрак в 09:00. Обед - в 21-30".match(re) );
Обратим внимание, что дефис '-' не экранирован, поскольку в начале скобок он не может иметь специального смысла.
Комментарии
- Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
- Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
- Комментарии без смысла, с рекламой или не о статье вообще - удаляются.