как проверить регулярное выражение js
Для проверки регулярного выражения в JavaScript можно использовать метод test() объекта RegExp . Этот метод возвращает true , если регулярное выражение соответствует строке, и false в противном случае.
Например, чтобы проверить, соответствует ли строка «hello» регулярному выражению /^h.*o$/ , можно написать следующий код:
const regex = /^h.*o$/; const str = 'hello'; const result = regex.test(str); console.log(result); // true
В этом примере мы создали регулярное выражение /^h.*o$/ , которое соответствует строкам, начинающимся с буквы «h» и заканчивающимся буквой «o». Затем мы вызвали метод test() с аргументом «hello» и сохранили результат в переменной result . В конце мы вывели значение переменной result в консоль, которое должно быть true , так как строка «hello» соответствует регулярному выражению.
Проверка регулярных выражений
Описание калькулятора для проверки регулярных выражений. И немного про регулярные выражения.
Раньше я как-то не очень любил регулярные выражения. Они казались мне довольно странной и загадочной штукой, которую невозможно понять. Однако недавно по работе понадобилось применить их во всю мощь, ну и пришлось разобраться.
По моему опыту, чтобы разобраться, надо просто найти толковое описание. Могу порекомендовать главу 24 из книги Джозефа и Бена Албахари «C# 3.0. Справочник» издательства O’Reilly. До C# 3.0 дело у меня так и не дошло, и это единственная глава из книги, которую я прочитал, но про регулярные выражения написано понятно.
Собственно, регулярки — крутейшая вещь. И везде они есть, в том числе и на Javascript, на котором пишутся все калькуляторы на нашем сайте. В нем есть такой объект RegExp. Вот ты туда текст регулярки пихаешь, и начинаешь ее по всякому использовать.
Во-первых, есть такой метод test(string) — возвращает выражение true, если регулярка заматчилась (нашлось совпадение в тексте), и false, если ничего не нашлось.
Во-вторых, есть метод exec(string) — который позволяет извлечь то, что заматчилось. В результате вызова этого метода получаем массив результатов. Он нужен, если в тексте регулярки мы использовали группировку скобками ().
Массив там, кстати, не очень массив. Если были группы, то нулевой элемент массива это все совпадение целиком, а все последующие — это группы. Кроме того, там есть два свойства, input — это вообще вся строка, которую передали на вход, и index — видимо, индекс в массиве (не знаю, зачем оно нужно).
В-третьих, можно использовать регулярку для замены по строке, вызовом source_string.replace(regex, replace_string). Наверно, для этого ее используют больше всего.
Ну а ниже калькулятор, который позволит поиграться с регулярными выражениями.
Вводим текст, на который будет натравливаться регулярное выражение, само выражение, модификаторы (по умолчанию — искать по всей строке), строку для замены.
На выходе получаем результаты вызовов методов test, exec, и replace на введенном тексте. Вот так можно на ходу тренироваться на кошках, если не уверен, что твоя регулярка правильно сработает.
Тестер Регулярных Выражений
Считаете ли вы этот инструмент полезным? То поделитесь этим с друзьями или коллегами. Это поможет нам сделать наши бесплатные веб-инструменты лучше.
Этот бесплатный тестер RegEX позволяет вам проверять ваши регулярные выражения, просто введите его ниже:
Регулярное выражение
Тестовая Строка
Заменить на (Необязательно)
Вы можете использовать $ 1, $ 2, $ 3 и т. д., Если вы используете группы скобок в своем регулярном выражении. \t \n \r поддерживаются.
Проверить Заменить Параметры Примеры Очистить Ваш результат можно увидеть ниже.
Флаги
- i — Без учета регистра
- m — Многострочный
- g — Глобальный (не останавливайтесь на первом матче)
- s — Точка соответствует всем ВКЛЮЧЕНИЯМ разрывов строк
Примеры
Это всего лишь примеры, поэтому не полагайтесь на их 100% работу.
Тип | Описание | Выражение |
---|---|---|
Дата | Соответствует формату даты YYYY-mm-dd H:i:s (MySQL Date) | \d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])+ |
Строка | Простой пример соответствия слов в тексте | [a-zA-Z]+ |
URL | Соответствует элементам URL, включая протокол, поддомен, домен, путь, имя файла, параметры запроса и привязку. | (https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]|www\.[a-zA-Z0-9]\.[^\s]) |
IP | Соответствует элементам IP-адреса (IPv4). Это позволит убедиться, что каждое число в IP-адресе находится между 0 и 255 . | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b |
Цвет | Соответствует элементам шестнадцатеричного цветового кода (#FFFFFF). Знак «#» является необязательным, и цветовой код может принимать либо шестнадцатеричный, либо шестнадцатеричный формат. | #(([0-9a-fA-F])|([0-9a-fA-F])) |
Соответствует адресу электронной почты. | [a-zA-Z0-9.!#$%&’*+/=?^_`<|>~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-][a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-][a-zA-Z0-9])?)* |
Простой сопоставитель регулярных выражений
Данный алгоритм работает быстрее недетерминированного конечного автомата, построенного по теореме Клини, но только для регулярных выражений, состоящих из символов:
[math]c[/math] — один любой буквенный символ, [math]\ldotp[/math] — один любой символ, [math]\wedge[/math] — символ начала текста, [math]$[/math] — символ конца текста, [math]*[/math] — предыдущий символ встречается ноль или более раз.
Например, для [math]\mathtt[/math] , очевидно, проще написать простой сопоставитель, чем строить НКА.
Псевдокод
// поиск вхождения регулярного выражения в любом месте текста function match(regexp: String, text: String): boolean if regexp[0] == '^' return matchHere(regexp[1:], text) // regexp[n:] возвращает regexp без первых n элементов за O(1) int i = 0 while i
text.length if matchHere(regexp, text[i:]) return true i++ return false Функция [math]\mathrm
Логика функции [math]\mathrm[/math] проста. Если [math]\wedge[/math] — первый символ регулярного выражения, то любое возможное вхождение должно начинаться в начале текста. То есть если [math]\wedge[/math] [math]abc[/math] — регулярное выражение, то [math]abc[/math] должно входить в текст только с первой позиции текста, а не где-то в середине текста. Это проверяется путем сопоставления остатка регулярного выражения с текстом, начиная с первой позиции и нигде более.
В противном случае регулярное выражение может входить в текст в любой позиции. Это проверяется путем сопоставления регулярного выражения во всех позициях текста. Если регулярное выражение входит более одного раза в текст, то только самое левое вхождение будет распознано. То есть если [math]abc[/math] — регулярное выражение, то для него найдется самое левое вхождение в текст.
// поиск вхождения регулярного выражения в начале текста function matchHere(regexp: String, text: String): boolean if regexp[0] == '\0' return true if regexp[1] == '*' // не будет выхода за пределы строки, так как в конце regexp и text всегда есть символ '\0' return matchStar(regexp[0], regexp[2:], text) if regexp[0] == '$' and regexp[1] == '\0' return text == '\0' if text[0] != '\0' and (regexp[0] == '.' or regexp[0] == text[0]) return matchHere(regexp[1:], text[1:]) return false
Основная часть работы сделана в [math]\mathrm
// сопоставление с регулярным выражением вида: c* function matchStar(c: char, regexp: String, text: String): boolean int i = 0 while i
text.length and (text[i] == c or c == '.') if matchHere(regexp, text[i:]) return true i++ return false Рассмотрим возможные случаи:
- Если в ходе рекурсии регулярное выражение осталось пустым [math]\mathrm<(regexp[0] == \backslash0)>,\,[/math] то текст допускается этим регулярным выражением.
- Если регулярное выражение имеет вид [math]c*[/math] , то вызывается функция [math]\mathrm,\,[/math] которая пытается сопоставить повторение символа [math]c[/math] , начиная с нуля повторений и увеличивая их количество, пока не найдет совпадение с оставшимся текстом. Если совпадение не будет найдено, то регулярное выражение не допускает текст. Текущая реализация ищет «кратчайшее совпадение», которое хорошо подходит для сопоставления с образцом, как в grep[1] , где нужно как можно быстрее найти совпадение. «Наидлиннейшее совпадение» более интуитивно и больше подходит для текстовых редакторов, где найденное заменят на что-то. Большинство современных библиотек для работы с регулярными выражениями предоставляют оба варианта.
- Если регулярное выражение это [math]$[/math] , то оно допускает этот текст тогда и только тогда, когда текст закончился.
- Если первый символ текста совпал с первым символом регулярного выражения, то нужно проверить совпадают ли следующий символ регулярного выражения со следующим символом текста, сделав рекурсивный вызов [math]\mathrm[/math] .
- Если все предыдущие попытки найти совпадения провалились, то никакая подстрока из текста не допускается регулярным выражением.
Модификации
Немного изменим функцию [math]\mathrm[/math] для поиск самого левого и самого длинного вхождения [math]c*[/math] :
- Найдем максимальную последовательность подряд идущих символов [math]c[/math] . Назовем ее [math]S[/math] .
- Сопоставим часть текста без [math]S[/math] с остатком регулярного выражения.
- Если части совпали, то текст допускается этим регулярным выражением. Иначе, если [math]S[/math] пусто, то текст не допускается этим регулярным выражением, иначе убираем один символ из [math]S[/math] и повторяем шаг [math]2[/math] .
Псевдокод
function matchStar(c: char, regexp: String, text: String): boolean int i for (i = 0; text[i] != '\0' and (text[i] == c or c == '.'); i++) while i
0 if matchHere(regexp, text[i:]) return true i-- return false