| 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) | Находит , но не запоминает найденное. Это называется "незапоминающие скобки". Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp.Как и все скобки, объединяют  находящееся в них в единый подпаттерн.x |  
| 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 | Где - буква от A до Z. Обозначает контрольный символ в строке. Например,X/\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 | Найдет символ с кодом (2 шестнадцатиричных цифры)hh |  
| \uhhhh | Найдет символ с кодом (4 шестнадцатиричных цифры).hhhh |  Пример: изменение формата строки 
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
alert(newstr); // "Smith, John"
 
 Методы
toStringtestexec 
 Свойства
globalignoreCasemultilinelastIndexsource | 
Изложено все подробно. Отдельное спасибо автору!
Есть вопрос! Как вставлять переменную в регулярное выражение?
Хочу реализовать нормальный поиск по классам для случая, когда элементу приписано 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] ); }>Как вставлять переменную в регулярное выражение?
формируйте регулярное выражение в виде строковой переменной. Содержимое переменной должно быть без слешей
А пример можно?
l удоволетворяет выражению rl
выводит
true
false
true
почему и что делать
АГА! Я тоже наступил.
В случае если
var rl = /abc/ig;
alert(rl.test(l.name)+"\n"+rl.test(l.name)+"\n"+rl.test(l.name));
выводит как и у вас.
А если
var rl = new RegExp( "abc", "ig");
тогда все обрабатывается правильно. Видино нужно как-то резетить встроенный регексп...
В 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 - фоле формы
Не подскажете, в чём проблема?
В JS есть встроенный тип RegExp.
this.value.match(/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/); this.value.match(/\w+@\w+\.[a-z]{2,3}/);Или
var re = new RegExp ('[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}')
var re = new RegExp ('\w+@\w+\.[a-z]{2,3}')
т.е. без слешей, обозначающих границы регулярного выражения.
Только что убил на это час :-)
А еще слеши нужно экранировать.
Уже домены появились .info, .aero и т.п.
поэтому лучше {2,3} заменить на {2,4}
ага, а еще есть .travel
а уменя адрес, вообще dima@localhost.localdomain

Правильно использовать {2,}, а еще бывают домены первого уровня (напр в интранетах)
Двойные кавычки в начале и в конце не нужны!
Уже домены появились .info, .aero и т.п.
поэтому лучше {2,3} заменить на {2,4}
Closure Compiler заменяет "new RegExp()" на "RegExp()".
Влияет ли это хоть как-то на скорость выполнения?.
Если да - на сколько? Если нет - какой смысл писать "new..." ?
вы юзаете /i, /gi и т.п., но ничего о них не пишете
вы не находите что неплохо бы добавить их описание ?
или для них здесь есть отдельная страничка ? - тогда киньте ссылку
А если ещё раз внимательно посмотреть в начало статьи?)
А как подсчитать количество совпадений?
Ошибочка?
Обозначает повторение 0 или более раз. Например, /bo*/ найдет 'boooo' в "A ghost booooed" и 'b' в "A bird warbled", но ничего не найдет в "A goat grunted".
Есть строка "math.sin()" Нужно находить только sin и только тогда когда пред ним math. а после (
(?:math\.)\w+(?:\() находит math.sin( подскажите где ошибка.
Так и должно быть.
/bo*/ означает "b" и за ним "o" 0...бескон. раз.
Условию удовлетворяют:
- "A ghost booooed"
- "A bird warbled"
function example(value) { return (/^abc$/gi).test(value); } alert(example("abc") + ", " + example("abc"));вот такая штука везде кроме фф3 выдает true, true, а в нем - true, false.
по какой-то неведомой причине фф3 считает, что при повторном вызове функции можно использовать ссылку на старый объект регулярки, а не создавать новый. если изменить конструкцию на new RegExp, то все нормально становится.
Товарищ, у вас наверняка IE. Избавляйтесь по-скорее. На эту тему против дрочеров мелкософта даже своя фича есть: "ИЕ - лучший браузер... только для того, чтобы скачать другой". Что я посоветую
Хром не стану советовать, потому что жаба-интерпретатор в нем однозначно гребнутый. А на оперу не гоните, очень удобная маза - opera dragonfly, верестать довольно удобно, а еще удобней при написании жабы для уже готовых сайтов. А саму жабу - по старинке - блокнот
З.Ы. лично у меня при
function example(value) { return (/^abc$/gi).test(value); } alert(example("фф3") + ", " + example("фф3")); //выдает false,falseСпасибо, конечно, за совет )
Только, когда я что-нибудь пишу, возникает необходимость, чтобы работало все одинакого у всех. В этом и состояла проблема (собственно, это и не проблема, т.к. решена уже, и причем написано про это в том же моем посте).
И ваш пример отличается от моего. Он, конечно, будет false выдавать независимо от того, один и тот же объект регулярки используется или разные.
Собственно, ответ на то, почему так, я уже нашел на этом же сайте.
http://javascript.ru/tutorial/regexp-specials#staticheskie-svoystva
раньше просто этого не заметил
Кто-то знает что обозначает значок '$&' в результате замены с помощью регулярок?
В спецсимволах явно * не хватает
Подскажите, правильно ли делаю: нужно найти все выражения(именно с точкой):
.2009
2009.
(^(\.))2009
2009(?=\.)
Правильно ли я делаю, а то он все с 2009 ищет, не взирая на точку...
(?:\.2009|2009\.)
лучше так..
если два поиска нужно - то
\.2009
2009\.
если сойдёт и третий вариант (без точек)
то можно сократить до: \.?2009\.?
тогда поймает и 11.02.2009 и 2009.03.08 и 21200908
не надо злоупотреблять скобками и символами, смысла которых не поняли
в частности (^(\.)) - означает найти в начале строки точку и поместить её в переменные $1 и $2
вопрос:
как отфильтровать все латинские, все нелатинские буквы?
/w*/ - фильтрует и латиницу и кирилицу
как отфильтровать только латиницу ?
Как видно, \w ищет только латинские символы.
А можно как-то при замене сразу работать с результатами поиска ?
Пример задачи: в HTML-коде все имена тегов перевести в UPCASE.
Добрый день
Осваиваю JScript, который во много похож на JavaScript. Изучаю в среде Windows Vista.
Необходимо, в пути из локальной сети «\\сервер\папка\папка\файл.jpg» заменить обратные слэши на прямые, чтобы в результате получить: «//сервер/папка/папка/файл.jpg»
Прочитал кучу брошюр по replace и RegExp с метасимволами и модификаторами, и кучу ссылок в Инете, ничего пока адекватно не заработало.
Пробовал многими способами, один из них:
Результат «/серверпапкапапкафайл.jpg»
Или:
Даёт результат: «//с/е/р/в/е/р/п/а/п/к/а/п/а/п/к/а/ф/а/й/л/./j/p/g»
Может, у кого имеется готовая заготовка на этот случай?
Спасибо
Все верно, символ \ является служебным. Пример (в консоли файрбага):
Таким образом, к обработке принимается только единственный первый обратный слеш. Для правильной обработки обратные слеши должны быть двойными в исходной строке.
Надо использовать replaceAll и поставить в регулярном выражении ключ "g"
Грамотная статья. Основные сведения изложены в лаконичной и понятной форме. Спасибо.
Можно добавить что для экранирования в RexExp, когда используешь обычную строку, нужно использовать два слеша.
К регулярным выражениям, это никак не относиться, если пишете скрипты, то должны знать основы языка.
Как в javascript в паттерне регулярного выражения использовать переменную?
Напимер
var q="3";
var pattern=/q/; - q - значение переменой
Подскажите пожалуйсто что я делаю не так???
<script type="text/javascript"> if ( document.forms["smart"].Dest.value.match(/\d\|\|/) == '4||' ) { document.forms["smart"].submit(); }; </script>У меня два вопроса.
Первый:
Есть ли реализация для смотрящих вперед и назад выражений("(?=)" и "(?<=)")?
Второй
Расскажите пожалуйста поподробнее про работу конструкции "(?:)".
Благодарю за внимание.
"Смотрящих вперед" есть. "Смотрящих назад" нет. Особенность JS.RegExp... =(
Мне один раз из-за этого пришлось полмодуля переделывать на ... =C
(?: ... ) - в начале подгруппы (скобок) можно написать "?:" и тогда результат, если можно так сказать, подзапроса просто не записывается в "capturing groups".
Логично, если вы не собираетесь где-то использовать его через "\1".."\9" - что память занимать лишний раз. =)
В начале статьи ошибка - "обраный" слэш
Как разрешить ввод только кириллицы пробелов и дефисов?
Просто хочется сказать огромное СПАСИБО автору статьи, да и вообще сайта — с их помощью разобрался в чужом коде и regexp-ax? хотя раньше JavaScript в глаза не видел.
СПАСИБО!!!
Есть строка "math.sin()" Нужно находить только sin и только тогда когда пред ним math.
(?:math\.)\w+ находит math.sin подскажите где ошибка.
Пробовал как в википедии: (?<=math\.)\w+ тогда браузер пишет ошибку
Uncaught exception: SyntaxError: RegExp constructor: invalid regular expression
помогите пожалуйста! есть страничка с 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();
}
}
}
}
}
есть два выражения, назовем их X и Y
как найти Y при условии что перед ним не идет X?
т.е. "[^X]Y" но при этом рассматривать X и Y именно как выражения или строки, а не отдельные символы.
Доброго времени суток, уважаемые специалисты.
Впервые столкнулся с регэкспами... Пока обходился без него, но жизнь заставила).
Не могу сформировать шиблон для задачи:
Нужно проверить, подходит ли строка под шаблон ЧИСЛО.ЧИСЛО
На данный момент додумался вот до этого:
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), что неправильно.
Подскажите, пожалуйста, где я не прав, и как должен выглядеть шаблон. Буду благодарен за пояснения.
Заранее благодарю всех откликнувшихся.
я бы сделал просто:
function CheckChain(Chain){ var validRegExp = /^[0-9]+\.[0-9]+$/; var rslt = validRegExp.exec(Chain); if(rslt){return rslt[0];}else{return -1;} }Естественно вы можете возвращать null если вам это нужно или любое другое значение, если регексп не выполнился, т.е. значение Chain под него не подошло.
Ваша главная ошибка в плюсе после \.)+
+ - означает что выражение (в вашем случае в скобках) должно встретится 1 и более раз.
ну и конечно же
- если вам нужны отрицательные числа. В данном случае -? означает что знак минус может встретится 1 раз или отсутствовать.
Большое спасибо за ответ. Сейчас попробую реализовать. По результату отпишусь. Отрицательные числа не нужны.
Все отлично, все работает. Все суперррр)
Вопрос:
как получить последнее вхождение в строке?
Добрый день!
Скажите, есть ли возможность задать содержимому объекта RegExp определенный CSS стиль?
Вопрос не понятен, RegExp объект - это шаблон для поиска в строке, при чем тут CSS стиль? Если вы имеете в виду могут ли регулярные выражения содержать стили, то да, они могут содержать любой текст.
Прочитала вашу статью и все равно не помогло справится с regxp .
Есть var temp= ^\\s*-?[0-9]\\d*(\\.\\d{1,2})?\\s*$
Может кто подскажет какой regxp добавить чтобы проверить пробел в начале и конце?
Попробуйте так
var temp = new RegExp('^\\s+-?[0-9]\\d*(\\.\\d{1,2})?\\s+$');
Нужно было заменить \\s* на \\s+
Спасибо, помогло !).
Привет, еще раз. Работаю на большом проекте, боюсь аффектнет половину платежей. Добавить в RegExp валидацию на -, значит выпилить "-? "
var temp = new RegExp('^\\s+-?[0-9]\\d*(\\.\\d{1,2})?\\s+$');
да, символ ? значит, что знак перед ? может встречаться один либо 0 раз. Т.е использую конструкцию -?, у вас будет возможность 1 раз ввести -. Удалив ее вы не сможете вводить отрицательные значения.
Еще такие спецсимволы не указаны (?<=y)x и (? аналоги x(?=y) и x(?!y) только наоборот.
Подскажите плз, как правильно пользоваться незапоминающими скобками
Легенда такая: найти нужно некую последовательность символов(имя), после известной последовательности(Madam), которая нам не нужна
rg = new RegExp('(?:Madam) (.+)','i');//наивно надеясь что Madam не попадет в результат, а все после попадет пишем такой регэксп
rg.exec('Madam Pompadur'); //["Madam Pompadur", "Pompadur"] получаем такой результат - в результат записалось и то что хотели запомнить и то что не хотели
вопрос в следующем, как записать что бы получить только ["Pompadur"] ?
можно обойтись без "незапоминающих скобок":
var rg = /(^Madam )/i;
console.log ('Madam Pompadur'.replace(rg, ''));
Текст набран шрифтом "Font". В нем встречаются слова, в которых один из символов набран другим шрифтом ("NewFont"). Как найти эти слова и составить из них словарь (массив)? Спасибо.
Прикольно читать статью по регэкспу, где полбуквы рвёт результат в клочья, с несоблюдением простенького русского правила тся-ться. Школота в комментариях не в счёт
Всем привет, подскажите пожалуйста такой момент, для валидации полей написал регулярку, которая должна запрещать введение некоторых спецсимволов
^[^\\\/:*?\"<gt;|]*$с этой задачей справляется, но мне нужно еще запретить вводить пробел в пустую строку. То есть слова с пробелами допустимы, но просто пробел без других символов нет. Пробовал по разному писать это правило, но не срабатывает. В лучшем случае удается вообще запретить пробелы.
будте аккуратны
/^a|b/.exec('zb')удачно найдет b
хотя подразумевалось наверно
Объясните поведение метасимвола ^ в многострочном режиме m
Имеется файл с пустыми строками в ANSI кодировке со стандартными символами переноса строки и возврата каретки
Если удалить \n или \r
Аналогичное поведение если ищем конец строки в многострочном режиме.
Подозреваю, что в многострочном режиме для универсальности \n и \r равнозначно принимаются за конец и начало строки поэтому результат в первом случае в два раза больше.
Где подробнее почитать, как с флагом /m вычисляется, что считать началом ^, а что концом строки $?
полная форма записи с использованием among us конструктора RegExp и сокращенная форма записи (литеральный формат) с использованием слешей.
Я очень внимательно прочитал ваш пост и просто хочу сказать, что информация, которой вы поделились, замечательна и я многому из нее научился.
Да, научиться использовать регулярные выражения очень полезно. Я использовал их для создания сайта SSSTikTok для извлечения со страниц ссылок на видео tiktok.com. Это очень полезные инструменты.
RegExp заслуживает похвалы за свою универсальность, эффективность и гибкость, которые делают его неотъемлемой частью работы с текстовыми данными в fnaf JavaScript.