С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147

Метасимвол в регулярных выражениях

18.07.2012, 00:56. Показов 2692. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Символ "." означает любой символ кроме перевода на новую строку. А символ "\." непосредственно саму ".". Но не пойму по описанию автора в чем разница между двумя кусками

JavaScript
1
2
3
4
var Str = "29,04.2007";
p = /^[0-3]\d\.[01]\d\.[12][09]\d\d$/;
if (p.test(Str)) document.write("Дата введена правильно");
else document.write("Дата введена неправильно");
JavaScript
1
2
3
4
var Str = "29,04.2007";
p = new RegExp("^[0-3]\\d\\.[01]\\d\\.[12][09]\\d\\d$");
if (p.test(Str)) document.write("Дата введена правильно");
else document.write("Дата введена неправильно");
В чем смысл двух "\"?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2012, 00:56
Ответы с готовыми решениями:

Пробел в регулярных выражениях
Подскажите как можно поставить пробел в выражении: <script> var re = /\d\d\d\d/g; alert( "Завтрак в 09:00.Обед - в...

Значение $1 в регулярных выражениях
replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1"); Не совсем выкупаю что делает $1. Это перестановка?

Символьные классы POSIX в регулярных выражениях
Почему не отрабатывает код? function validateUsr(username) { let regex = new RegExp("+"); ...

8
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
18.07.2012, 02:14
В первом случае (первый синтаксис), когда шаблон ограничен двумя прямыми слешами, он запоминается "как есть" (AS IS), причём запоминается в момент загрузки скрипта.

Во втором случае (второй синтаксис), когда шаблон прописан в кавычках, он компилируется (сиречь вычисляется) перед выполнением.
И компилируется шаблон посимвольно, путём первоначальной разбивки строки на отдельные символы и затем происходит конкатенация (символы сливаются в одну строку).
Т.е. "внутри" браузера строка "abcd" преобразуется в "a"+"b"+"c"+"d", которая затем превращается во внутреннее значение abcd

Одинарный символ обратного слеша при компиляции переменной типа String рассматривается браузером ВСЕГДА как экранирование следующего символа.
Т.е. запись типа "a"+"\" в результате будет преобразована в a + "КАВЫЧКА и НЕТ закрывающей кавычки (что даст ошибку синтаксиса).

Правильной будет запись "a"+"\\", что даст a\
0
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147
18.07.2012, 02:47  [ТС]
За объяснение по компиляции спасибо.
Но вот как раз слеша в дате быть и не должно.
Т.е. проблема в не том, что "\"" будет интерпретировано как """. С точки синтаксиса в примерах все правильно. Только непонятно зачем вместо "\." идет "\\.", вместо "\d" идет "\\d" и т.д.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
18.07.2012, 14:07
polyaKIDze, перечитываем написанное выше ЕЩЁ РАЗ.
Но внимательно, пытаясь понять.

Нужный вам шаблон - это ^[0-3]\d\.[01]\d\.[12][09]\d\d$
При использовании синтаксиса №1 вы его просто прописываете внутри двух прямых слешев, вот так:
/^[0-3]\d\.[01]\d\.[12][09]\d\d$/

При использовании синтаксиса №2 вам надо из какой-то строки получить
"какая-то строка" >>> ^[0-3]\d\.[01]\d\.[12][09]\d\d$
Эта самая какая-то строка будет компилироваться, т.е. исполняться посимвольно, а потом сливаться в одну.
Положим, захотели вы его записать ТАКИМ ЖЕ ОБРАЗОМ, как и для синтаксиса №1, но не в прямых слешах, а в кавычках. Вот так:
"^[0-3]\d\.[01]\d\.[12][09]\d\d$"

Начинаем разбивать на отдельные символы, компилировать их и сливать в одну строку:
"^" >>> это ^, т.е. то, что нам и надо первым символом
"[" >>> [, итого при слиянии ^[
"0" >>> 0, итого ^[0
"-" >>> -, итого ^[0-
"3" >>> 3, итого ^[0-3
"]" >>> ], итого ^[0-3]

"\" >>> Стоп-машина. В переменной типа String браузер ВСЕГДА воспринимает обратный слеш как экранирование следующего символа. Поэтому браузер автоматически возьмёт ещё один символ, следующий за обратным слешем. Вот так:
"\d" >>> d, итого ^[0-3]d. Ещё раз - стоп-машина. Нужный шаблон НЕ ПОЛУЧАЕТСЯ. Нам нужно получить обратный слеш и только потом символ d, а обратного слеша в итоговом шаблоне НЕТ.

Чтобы получить обратный слеш, его надо "заэкранировать" тем же обратным слешем. Вот так:
"\\" >>> \, итого ^[0-3]\

Что ещё непонятно???
Что в моём предыдущем сообщении было написано НЕ ТАК, что вы ничегошеньки не поняли?
3
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147
18.07.2012, 14:14  [ТС]
Согласен. Затупил. Все так было написано. В свою защиту могу сказать, что вопрос возник ночью после суток чтения учебника. С "утра" в ответах читается совсем другое)
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
18.07.2012, 14:38
polyaKIDze, добавлю, что эта самая "какая-то строка" изначально может быть составной и содержать какие-то переменные.
Например, для вашего шаблона:
JavaScript
1
2
var s = "\\d";
p = new RegExp ("^[0-3]" + s + "\\.[01]" + s + "\\.[12][09]" + s + s + "$");
Кроме того, отмечу, что преобразование \символ в "просто" символ в одном из браузеров происходит очень смешно.
Запустите следующий код, например, в FireFox:
HTML5
1
2
3
<script>
alert ('v' == '\v');
</script>
Что увидите? Правильно, будет написано false. Ведь действительно: слева - один символ, а справа - два символа. Никак не могут две эти строки быть одинаковыми.
А теперь запустите этот же код в браузере MSIE.
И в нём прочитаете true.
Это, кстати, самый простой способ определения браузера Explorer.
0
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147
19.07.2012, 00:05  [ТС]
Спасибо. Очень полезная информация. Книга, которую я читаю, сжата, т.к. в ней описаны и остальные средства web-мастера. К сожалению нет времени читать про каждый язык в подробностях.
А последним примером хотите сказать, что IE считает "v" и вертикальную табуляцию одним и тем же? Или они как-то по-другому понимают '\v'? Проверить не могу, т.к. IE отключен.

Добавлено через 20 минут
Не читайте 2 строчки выше.
Я сформулировал нормально вопрос: А эквивалентны ли строки записанные " " и ' '? Как вы писали строка, записанная через " ", будет компилироваться. Но если так же компилируется и строка, полученная с помощью ' ', то '\v' действительно распознается как v. Тогда где неправ IE?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
19.07.2012, 00:32
polyaKIDze, в JS кавычки одинарные и двойные по своему действию никак не различаются (в отличие, например, от PHP).

Можете проверить не только метасимвол.
Можно - любой символ.
Например, alert ('a' == '\a') также даст в MSIE результат true
В "нормальных" браузерах при сравнении, вероятно, задействован и механизм сравнения длины строковых переменных. Потому в результате и выдаёт false
0
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147
19.07.2012, 00:43  [ТС]
Исчерпывающе. Еще раз спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2012, 00:43
Помогаю со студенческими работами здесь

Знак фопроса в регулярных выражениях
Добрый день. Подскажите, как составить регулярное выражение, чтобы оно пропускало строку &quot;/get?user=123&quot; Мешает знак...

Отрицание в Регулярных выражениях
Есть шаблон Regex label = new Regex(@&quot;(?&lt;id&gt;*)&quot;); Нужно найти все вхождения в строку, НЕ СОВПАДАЮЩИЕ с группой id. Я уже сколько...

Использование [] в регулярных выражениях
Здравствуйте. Подскажите, пожалуйста, как можно в регулярных выражениях на c# использовать символы . Т.е. у меня есть строка...

Кириллица в регулярных выражениях
Здравствуйте! Имеется некий скрипт, который определяет спам-слова в тексте и выдает свою оценку на спам-содержание. Там есть...

Синтаксис в регулярных выражениях
есть две строчки. нужно, чтобы из двух строк: https://www.cyberforum.ru/index.php https://www.cyberforum.ru/index.php = ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru