Справочник javascript: RegExp

Форум

Учебник Node.JS скринкаст Стандарт языка

Справочник

Discord чат

 
Статьи Тест знаний Аналоги функций PHP  

RegExp

Создание

// полная форма записи
var expr = new RegExp(pattern [, flags]);
 
// сокращенная форма записи (литеральный формат)
var expr = /pattern/flags;

Аргументы

pattern
Шаблон поиска (текст регулярного выражения).
flags
Способы поиска по шаблону:
  • g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска);
  • i — не различать строчные и заглавные буквы;
  • m — многострочный поиск.

Порядок указания флагов не имеет значения.


Описание, примеры

Когда регулярное выражение создается при помощи конструктора new RegExp(…), необходимо помнить, что обратные слеши (\) должны экранироваться, например:

var expr = new RegExp('\\w', 'ig');

При использовании литерального формата, этого делать не нужно:

var expr = /\w/gi;

Обе записи эквивалентны. Первый вариант может понадобится, если вам придется генерировать регулярное выражение динамически.

Виды символов

В регулярных выражениях различают следующие виды символов:

Обычные символы

  • A..z — английские буквы от A до z, строчные и заглавные;
  • 0..9 — цифры;
  • { } — фигурные скобки, кроме случаев, когда они составляют группу вида {n,m} (где n и m — числа) и её вариации;
  • = — равно;
  • < — меньше;
  • > — больше;
  • - — минус;
  • , — запятая;
  • и др.
Специальные символы
  • ( ) — круглые скобки;
  • [ ] — квадратные скобки;
  • \ — обраный слеш;
  • . — точка;
  • ^ — степень;
  • $ — знак доллара;
  • | — вертикальная черта;
  • ? — вопросительный знак;
  • + — плюс.

Формирование регулярного выражения

При формировании шаблона поиска используется близкий к классическому PCRE синтаксис.

Спецсимволы в регулярном выражении

Свернуть/Развернуть таблицу

Символ Значение
\ Для обычных символов - делает их специальными. Например, выражение /s/ ищет просто символ 's'. А если поставить \ перед s, то /\s/ уже обозначает пробельный символ.И наоборот, если символ специальный, например *, то \ сделает его просто обычным символом "звездочка". Например, /a*/ ищет 0 или больше подряд идущих символов 'a'. Чтобы найти а со звездочкой 'a*' - поставим \ перед спец. символом: /a\*/.
^ Обозначает начало входных данных. Если установлен флаг многострочного поиска ("m"), то также сработает при начале новой строки.Например, /^A/ не найдет 'A' в "an A", но найдет первое 'A' в "An A."
$ Обозначает конец входных данных. Если установлен флаг многострочного поиска, то также сработает в конце строки.Например, /t$/ не найдет 't' в "eater", но найдет - в "eat".
* Обозначает повторение 0 или более раз. Например, /bo*/ найдет 'boooo' в "A ghost booooed" и 'b' в "A bird warbled", но ничего не найдет в "A goat grunted".
+ Обозначает повторение 1 или более раз. Эквивалентно {1,}. Например, /a+/ найдет 'a' в "candy" и все 'a' в "caaaaaaandy".
? Обозначает, что элемент может как присутствовать, так и отсутствовать. Например, /e?le?/ найдет 'el' в "angel" и 'le' в "angle."Если используется сразу после одного из квантификаторов *, +, ?, или {}, то задает "нежадный" поиск (повторение минимально возможное количество раз, до ближайшего следующего элемента паттерна), в противоположность "жадному" режиму по умолчанию, при котором количество повторений максимально, даже если следующий элемент паттерна тоже подходит.Кроме того, ? используется в предпросмотре, который описан в таблице под (?=), (?!), и (?: ).
. (Десятичная точка) обозначает любой символ, кроме перевода строки: \n \r \u2028 or \u2029. (можно использовать [\s\S] для поиска любого символа, включая переводы строк). Например, /.n/ найдет 'an' и 'on' в "nay, an apple is on the tree", но не 'nay'.
(x) Находит x и запоминает. Это называется "запоминающие скобки". Например, /(foo)/ найдет и запомнит 'foo' в "foo bar." Найденная подстрока хранится в массиве-результате поиска или в предопределенных свойствах объекта RegExp: $1, ..., $9.Кроме того, скобки объединяют то, что в них находится, в единый элемент паттерна. Например, (abc)* - повторение abc 0 и более раз.
(?:x) Находит x, но не запоминает найденное. Это называется "незапоминающие скобки". Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp.Как и все скобки, объединяют находящееся в них в единый подпаттерн.
x(?=y) Находит x, только если за x следует y. Например, /Jack(?=Sprat)/ найдет 'Jack', только если за ним следует 'Sprat'. /Jack(?=Sprat|Frost)/ найдет 'Jack', только если за ним следует 'Sprat' или 'Frost'. Однако, ни 'Sprat' ни 'Frost' не войдут в результат поиска.
x(?!y) Находит x, только если за x не следует y. Например, /\d+(?!\.)/ найдет число, только если за ним не следует десятичная точка. /\d+(?!\.)/.exec("3.141") найдет 141, но не 3.141.
x|y Находит x или y. Например, /green|red/ найдет 'green' в "green apple" и 'red' в "red apple."
{n} Где n - положительное целое число. Находит ровно n повторений предшествующего элемента. Например, /a{2}/ не найдет 'a' в "candy," но найдет оба a в "caandy," и первые два a в "caaandy."
{n,} Где n - положительное целое число. Находит n и более повторений элемента. Например, /a{2,} не найдет 'a' в "candy", но найдет все 'a' в "caandy" и в "caaaaaaandy."
{n,m} Где n и m - положительные целые числа. Находят от n до m повторений элемента.
[xyz] Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, [abcd] - то же самое, что [a-d]. Найдет 'b' в "brisket" и 'c' в "ache".
[^xyz] Любой символ, кроме указанных в наборе. Вы также можете указать промежуток. Например, [^abc] - то же самое, что [^a-c]. Найдет 'r' в "brisket" и 'h' в "chop."
[\b] Находит символ backspace. (Не путать с \b.)
\b Находит границу слов (латинских), например пробел. (Не путать с [\b]). Например, /\bn\w/ найдет 'no' в "noonday"; /\wy\b/ найдет 'ly' в "possibly yesterday."
\B Обозначает не границу слов. Например, /\w\Bn/ найдет 'on' в "noonday", а /y\B\w/ найдет 'ye' в "possibly yesterday."
\cX Где X - буква от A до Z. Обозначает контрольный символ в строке. Например, /\cM/ обозначает символ Ctrl-M.
\d находит цифру из любого алфавита (у нас же юникод). Используйте [0-9], чтобы найти только обычные цифры. Например, /\d/ или /[0-9]/ найдет '2' в "B2 is the suite number."
\D Найдет нецифровой символ (все алфавиты). [^0-9] - эквивалент для обычных цифр. Например, /\D/ или /[^0-9]/ найдет 'B' в "B2 is the suite number."
\f,\r,\n Соответствующие спецсимволы form-feed, line-feed, перевод строки.
\s Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /\s\w*/ найдет ' bar' в "foo bar."
\S Найдет любой символ, кроме пробельного. Например, /\S\w*/ найдет 'foo' в "foo bar."
\t Символ табуляции.
\v Символ вертикальной табуляции.
\w Найдет любой словесный (латинский алфавит) символ, включая буквы, цифры и знак подчеркивания. Эквивалентно [A-Za-z0-9_]. Например, /\w/ найдет 'a' в "apple," '5' в "$5.28," и '3' в "3D."
\W Найдет любой не-(лат.)словесный символ. Эквивалентно [^A-Za-z0-9_]. Например, /\W/ и /[^$A-Za-z0-9_]/ одинаково найдут '%' в "50%."
\n где n - целое число. Обратная ссылка на n-ю запомненную скобками подстроку. Например, /apple(,)\sorange\1/ найдет 'apple, orange,' в "apple, orange, cherry, peach.". За таблицей есть более полный пример.
\0 Найдет символ NUL. Не добавляйте в конец другие цифры.
\xhh Найдет символ с кодом hh (2 шестнадцатиричных цифры)
\uhhhh Найдет символ с кодом hhhh (4 шестнадцатиричных цифры).

Пример: изменение формата строки

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
alert(newstr); // "Smith, John"

Методы

toString
test
exec

Свойства

global
ignoreCase
multiline
lastIndex
source

См. также


Автор: hex.style (не зарегистрирован), дата: 4 декабря, 2009 - 20:09

#permalink

Изложено все подробно. Отдельное спасибо автору!

Есть вопрос! Как вставлять переменную в регулярное выражение?

Хочу реализовать нормальный поиск по классам для случая, когда элементу приписано 2 класса одновременно. Необходимо представить strClassName в виде отдельного слова.

function getElementsByClassName( strClassName, obj ) {
    if ( obj.className.match(/\strClassName\b/) ) {
        aryClassElements[aryClassElements.length] = obj;
    }
    for ( var i = 0; i < obj.childNodes.length; i++ )
        getElementsByClassName( strClassName , obj.childNodes[i] );
}

Автор: KOLANICH, дата: 19 февраля, 2010 - 23:03

#permalink
alert(rl.test(l.name)+"\n"+rl.test(l.name)+"\n"+rl.test(l.name));

l удоволетворяет выражению rl
выводит

true
false
true
почему и что делать


Автор: Гость (не зарегистрирован), дата: 19 апреля, 2010 - 20:38

#permalink

В js-обьекте match использовал регулярное выражение, удачно используемое в php-функции preg_match() для проверки адреса почты. Детально проверил по данной инструкции, поигрался с упрощением... кажется всё в норме, но почемуто выдаёт null... Вот, собственно сам пример, полный вариант и упрощённый:

this.value.match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/");
this.value.match("/\w+@\w+\.[a-z]{2,3}/");

this.value точно присутствует: this - фоле формы
Не подскажете, в чём проблема?






Автор: skAmZ (не зарегистрирован), дата: 4 сентября, 2010 - 20:05

#permalink

Уже домены появились .info, .aero и т.п.
поэтому лучше {2,3} заменить на {2,4}


Автор: o0 (не зарегистрирован), дата: 14 октября, 2010 - 14:53

#permalink

Closure Compiler заменяет "new RegExp()" на "RegExp()".
Влияет ли это хоть как-то на скорость выполнения?.
Если да - на сколько? Если нет - какой смысл писать "new..." ?


Автор: Гость (не зарегистрирован), дата: 19 ноября, 2010 - 15:37

#permalink

вы юзаете /i, /gi и т.п., но ничего о них не пишете
вы не находите что неплохо бы добавить их описание ?
или для них здесь есть отдельная страничка ? - тогда киньте ссылку


Автор: Гость (не зарегистрирован), дата: 2 декабря, 2010 - 16:02

#permalink

А как подсчитать количество совпадений?


Автор: Гость (не зарегистрирован), дата: 5 февраля, 2011 - 23:25

#permalink

Ошибочка?
Обозначает повторение 0 или более раз. Например, /bo*/ найдет 'boooo' в "A ghost booooed" и 'b' в "A bird warbled", но ничего не найдет в "A goat grunted".


Автор: Researcher, дата: 23 марта, 2011 - 15:54

#permalink
function example(value) { 
   return (/^abc$/gi).test(value); 
}
alert(example("abc") + ", " + example("abc"));

вот такая штука везде кроме фф3 выдает true, true, а в нем - true, false.
по какой-то неведомой причине фф3 считает, что при повторном вызове функции можно использовать ссылку на старый объект регулярки, а не создавать новый. если изменить конструкцию на new RegExp, то все нормально становится.


Автор: Гость (не зарегистрирован), дата: 18 апреля, 2011 - 10:43

#permalink

Кто-то знает что обозначает значок '$&' в результате замены с помощью регулярок?


Автор: Валерка (не зарегистрирован), дата: 23 мая, 2011 - 11:25

#permalink

В спецсимволах явно * не хватает


Автор: Гость (не зарегистрирован), дата: 26 мая, 2011 - 15:26

#permalink

Подскажите, правильно ли делаю: нужно найти все выражения(именно с точкой):
.2009
2009.

(^(\.))2009
2009(?=\.)

Правильно ли я делаю, а то он все с 2009 ищет, не взирая на точку...


Автор: Гость (не зарегистрирован), дата: 1 июня, 2011 - 13:46

#permalink

вопрос:
как отфильтровать все латинские, все нелатинские буквы?


Автор: Сергей N (не зарегистрирован), дата: 8 июля, 2011 - 23:28

#permalink

А можно как-то при замене сразу работать с результатами поиска ?

Пример задачи: в HTML-коде все имена тегов перевести в UPCASE.


Автор: Алекс_ (не зарегистрирован), дата: 29 июля, 2011 - 12:54

#permalink

Добрый день
Осваиваю JScript, который во много похож на JavaScript. Изучаю в среде Windows Vista.
Необходимо, в пути из локальной сети «\\сервер\папка\папка\файл.jpg» заменить обратные слэши на прямые, чтобы в результате получить: «//сервер/папка/папка/файл.jpg»
Прочитал кучу брошюр по replace и RegExp с метасимволами и модификаторами, и кучу ссылок в Инете, ничего пока адекватно не заработало.
Пробовал многими способами, один из них:

var part = /\\/g; // заменяет только один символ \ на один /, как и выражение /\\+/g
var FilePath = '\\сервер\папка\папка\файл.jpg'.replace(new RegExp(part), '/');

Результат «/серверпапкапапкафайл.jpg»
Или:

var part = /\\*/g;
var FilePath = '\\сервер\папка\папка\файл.jpg'.replace(new RegExp(part), '/');

Даёт результат: «//с/е/р/в/е/р/п/а/п/к/а/п/а/п/к/а/ф/а/й/л/./j/p/g»
Может, у кого имеется готовая заготовка на этот случай?
Спасибо


Автор: Гость (не зарегистрирован), дата: 26 октября, 2011 - 16:50

#permalink

Грамотная статья. Основные сведения изложены в лаконичной и понятной форме. Спасибо.


Автор: Гость (не зарегистрирован), дата: 16 ноября, 2011 - 12:53

#permalink

Можно добавить что для экранирования в RexExp, когда используешь обычную строку, нужно использовать два слеша.


Автор: ИгорьБ (не зарегистрирован), дата: 22 декабря, 2011 - 12:40

#permalink

Как в javascript в паттерне регулярного выражения использовать переменную?
Напимер
var q="3";
var pattern=/q/; - q - значение переменой


Автор: Гость (не зарегистрирован), дата: 9 января, 2012 - 19:21

#permalink

Подскажите пожалуйсто что я делаю не так???

<form action="/1.php" method="post" name="smart" id="smart">
<select name="Dest" id="Dest" class="Validate_Required"   >
<option value="||-">-</option>
<option value="7||А">А</option>
<option value="5||М">М</option>
<option selected="selected" value="4||Смарт">Смарт</option>
<option value="1||С">С</option>
<option value="2||Ц">Ц</option>
<option value="6||Ци">Ад</option>
<option value="8||Пр">Пр</option>
<option value="10||HW">HW</option>
<option value="3||под">под</option>
<option value="9||Тес">Тест</option>
</select>
</form>
<script type="text/javascript">
if ( document.forms["smart"].Dest.value.match(/\d\|\|/) == '4||' ) {
document.forms["smart"].submit();
};
</script>

Автор: hard-t, дата: 9 февраля, 2012 - 11:55

#permalink

У меня два вопроса.
Первый:
Есть ли реализация для смотрящих вперед и назад выражений("(?=)" и "(?<=)")?
Второй
Расскажите пожалуйста поподробнее про работу конструкции "(?:)".

Благодарю за внимание.


Автор: across, дата: 30 августа, 2012 - 21:19

#permalink

В начале статьи ошибка - "обраный" слэш


Автор: Гость (не зарегистрирован), дата: 26 сентября, 2012 - 19:12

#permalink

Как разрешить ввод только кириллицы пробелов и дефисов?


Автор: Гость (не зарегистрирован), дата: 18 октября, 2012 - 10:03

#permalink

Просто хочется сказать огромное СПАСИБО автору статьи, да и вообще сайта — с их помощью разобрался в чужом коде и regexp-ax? хотя раньше JavaScript в глаза не видел.
СПАСИБО!!!


Автор: Гость (не зарегистрирован), дата: 17 ноября, 2012 - 01:39

#permalink

Есть строка "math.sin()" Нужно находить только sin и только тогда когда пред ним math.

(?:math\.)\w+ находит math.sin подскажите где ошибка.


Автор: Гость (не зарегистрирован), дата: 17 ноября, 2012 - 01:52

#permalink

Пробовал как в википедии: (?<=math\.)\w+ тогда браузер пишет ошибку
Uncaught exception: SyntaxError: RegExp constructor: invalid regular expression


Автор: Гость (не зарегистрирован), дата: 20 ноября, 2012 - 09:05

#permalink

помогите пожалуйста! есть страничка с 3 текстовыми полями ИФО нужна проверка на заполненность окна и с проверкой что записано все только русскими буквами. я написала проверку заполненности но не поняла регулярные выражения( помогите пожалуйста.

function but1(b)
{

document.form.Act.value=b.name;
s = document.forms["form"]["second_name"].value;
f = document.forms["form"]["first_name"].value;
m=document.forms["form"]["middle_name"].value;
// Проверяем поля на заполненность
if (s.length==0)
{
document.getElementById("second_name").innerHTML="*поле Имя обязательно для заполнения";
return false;
}
else
{
if (f.length==0)
{
document.getElementById("first_name").innerHTML="*поле Фамилия обязательно для заполнения";
return false;
}
else
{
if (m.length==0)
{
document.getElementById("middle_name").innerHTML="*поле Отчество обязательно для заполнения";
return false;
}
else
{
confirm('Вы уверены?')
{
document.form.submit();
}
}
}
}
}


Автор: Гость (не зарегистрирован), дата: 19 января, 2013 - 04:48

#permalink

есть два выражения, назовем их X и Y
как найти Y при условии что перед ним не идет X?
т.е. "[^X]Y" но при этом рассматривать X и Y именно как выражения или строки, а не отдельные символы.


Автор: Гость (не зарегистрирован), дата: 28 января, 2013 - 10:59

#permalink

Доброго времени суток, уважаемые специалисты.
Впервые столкнулся с регэкспами... Пока обходился без него, но жизнь заставила).
Не могу сформировать шиблон для задачи:
Нужно проверить, подходит ли строка под шаблон ЧИСЛО.ЧИСЛО
На данный момент додумался вот до этого:

1	function CheckChain(Chain){
2	var validRegExp = /^(([0-9\-])+\.)+([0-9]{1,2})+$/;
3	var rslt = Chain.match(validRegExp);
4	return rslt;}

Работает, но есть 2 НО:
1) ошибка при выполнении, если Chain=Null (не оч. критично)
2) под шаблон попадают также значения типа ЧИСЛО.ЧИСЛО.ЧИСЛО.ЧИСЛО (1.2.17.56), что неправильно.
Подскажите, пожалуйста, где я не прав, и как должен выглядеть шаблон. Буду благодарен за пояснения.
Заранее благодарю всех откликнувшихся.




Автор: АК (не зарегистрирован), дата: 7 апреля, 2013 - 20:40

#permalink

Вопрос:
как получить последнее вхождение в строке?


Автор: Гость (не зарегистрирован), дата: 26 августа, 2013 - 10:35

#permalink

Добрый день!
Скажите, есть ли возможность задать содержимому объекта RegExp определенный CSS стиль?


Автор: Гость (не зарегистрирован), дата: 26 мая, 2014 - 14:44

#permalink

Прочитала вашу статью и все равно не помогло справится с regxp .
Есть var temp= ^\\s*-?[0-9]\\d*(\\.\\d{1,2})?\\s*$
Может кто подскажет какой regxp добавить чтобы проверить пробел в начале и конце?



Автор: Artod (не зарегистрирован), дата: 30 мая, 2014 - 13:59

#permalink

Еще такие спецсимволы не указаны (?<=y)x и (? аналоги x(?=y) и x(?!y) только наоборот.


Автор: krasovsky, дата: 28 октября, 2014 - 14:22

#permalink

Подскажите плз, как правильно пользоваться незапоминающими скобками
Легенда такая: найти нужно некую последовательность символов(имя), после известной последовательности(Madam), которая нам не нужна

rg = new RegExp('(?:Madam) (.+)','i');//наивно надеясь что Madam не попадет в результат, а все после попадет пишем такой регэксп
rg.exec('Madam Pompadur'); //["Madam Pompadur", "Pompadur"] получаем такой результат - в результат записалось и то что хотели запомнить и то что не хотели

вопрос в следующем, как записать что бы получить только ["Pompadur"] ?


Автор: Tormozz, дата: 19 сентября, 2015 - 14:52

#permalink

Текст набран шрифтом "Font". В нем встречаются слова, в которых один из символов набран другим шрифтом ("NewFont"). Как найти эти слова и составить из них словарь (массив)? Спасибо.


Автор: ДмитрийИ (не зарегистрирован), дата: 14 октября, 2015 - 12:25

#permalink

Прикольно читать статью по регэкспу, где полбуквы рвёт результат в клочья, с несоблюдением простенького русского правила тся-ться. Школота в комментариях не в счёт


Автор: weber, дата: 4 ноября, 2015 - 18:54

#permalink

Всем привет, подскажите пожалуйста такой момент, для валидации полей написал регулярку, которая должна запрещать введение некоторых спецсимволов

^[^\\\/:*?\"<gt;|]*$

с этой задачей справляется, но мне нужно еще запретить вводить пробел в пустую строку. То есть слова с пробелами допустимы, но просто пробел без других символов нет. Пробовал по разному писать это правило, но не срабатывает. В лучшем случае удается вообще запретить пробелы.


Автор: Филя (не зарегистрирован), дата: 21 октября, 2017 - 12:33

#permalink

будте аккуратны

/^a|b/.exec('zb')

удачно найдет b

хотя подразумевалось наверно

/^(a|b)/

Автор: CRLF (не зарегистрирован), дата: 23 ноября, 2017 - 04:48

#permalink

Объясните поведение метасимвола ^ в многострочном режиме m

Имеется файл с пустыми строками в ANSI кодировке со стандартными символами переноса строки и возврата каретки

txt = 'CRLF
CRLF
CRLF
CRLF
CRLF'

var str = txt.match(/^/mg);
alert(str.length);//Выведет 11

Если удалить \n или \r

txt = 'LF
LF
LF
LF
LF'

var str = txt.match(/^/mg);
alert(str.length);//Выведет 6

Аналогичное поведение если ищем конец строки в многострочном режиме.
Подозреваю, что в многострочном режиме для универсальности \n и \r равнозначно принимаются за конец и начало строки поэтому результат в первом случае в два раза больше.

Где подробнее почитать, как с флагом /m вычисляется, что считать началом ^, а что концом строки $?


Автор: Гость (не зарегистрирован), дата: 28 июля, 2023 - 11:00

#permalink

полная форма записи с использованием among us конструктора RegExp и сокращенная форма записи (литеральный формат) с использованием слешей.


Автор: time card calculator (не зарегистрирован), дата: 26 октября, 2023 - 05:14

#permalink

Я очень внимательно прочитал ваш пост и просто хочу сказать, что информация, которой вы поделились, замечательна и я многому из нее научился.


Автор: Clause (не зарегистрирован), дата: 11 февраля, 2024 - 22:43

#permalink

Да, научиться использовать регулярные выражения очень полезно. Я использовал их для создания сайта SSSTikTok для извлечения со страниц ссылок на видео tiktok.com. Это очень полезные инструменты.


Автор: Гость (не зарегистрирован), дата: 11 апреля, 2024 - 10:27

#permalink

RegExp заслуживает похвалы за свою универсальность, эффективность и гибкость, которые делают его неотъемлемой частью работы с текстовыми данными в fnaf JavaScript.


 
Поиск по сайту
Содержание

Дерево всех статей

Последние темы на форуме
Forum