Автор оригинала: FreeCodeCamp Community Member.
Виджаябхарати Баласубраманян
Вы один из тех людей, которые остаются вдали от регулярных выражений, потому что это выглядит как иностранный язык? Я был один. Уже нет.
Подумайте обо всех этих звуках, дорожных знаках и запах, которые вы можете распознать. Регулярные выражения не отличаются. Это как язык жестов для анализа строк.
Мы собираемся принять нашу голову регулярными выражениями сегодня. По крайней мере, регулярно использованные выражения.
Как и любой язык программирования, регулярное выражение является кратком языком самостоятельно.
Мы будем знать, как поставить регулярные выражения для хорошего использования к концу этой статьи. Мы будем решать простые проблемы и изучать нагрузки в процессе.
Готовы ли вы инвестировать 30 минут и выйти просвещенный в Regex? Успокоиться тогда.
Почему регулярные выражения?
У каждого у нас есть наша собственная «почему», не мы? Можно быть проверить, если строка является действительным шестигранным цветовым кодом. Вы можете писать библиотеку процессоров, как Sass Это использует Regex.
Я позволю Вселенной бросить Почему У вас и помогите вам охватить Как Отказ
0. Получить свою детскую площадку
Рекомендации
В большинстве случаев я нахожу эту страницу адекватной, чтобы пойти: Регулярные выражения MDN Отказ На самом деле, эта страница это все, что вам нужно. Вы можете перестать читать этот пост. Прямо сейчас. Закройте эту вкладку. ?
Все еще со мной? Спасибо. Вам нужна песочница для игры. К счастью, один доступен на вашем браузере. Просто используйте Devtools в консоли вашего браузера.
Ознакомьтесь с синтаксисом
Начать с того, мы собираемся использовать /expression/.test('string ')
синтаксис.
выражение
это какое-то регулярное выражение, которое мы строим. А строка
это строка под тестом. Тест
Метод возвращает правда
или ложь
в зависимости от матча.
Slashes отмечают начало и конец выражения. Обратите внимание на них, как двойные кавычки («) и одиночные цитаты (‘), которые вы используете на начальном знаке и конце простой строки.
Выражение между /
это буквальный. Они рассматриваются как буквальные персонажи. Имена переменной не будут разрешены до их содержимого.
Чтобы сделать его динамичным, нам придется пойти через маршрут конструктора, используя Новое Regex (Variable_name)
синтаксис. Это придет на спасение к концу поста.
Сделайте это прямо сейчас. Просто введите это в свою консоль браузера.
/a/.test("a"); //true /a/.test("b"); //false
Если это работает, вы готовы. Не беспокойтесь о том, что это такое. Это то, что мы собираемся разбиться на куски в следующих линиях.
Давайте погрузимся в …
1. Начните маленьким с буквами
Давайте начнем маленький. Нам нужно найти, есть ли строка определенный персонаж. Ищите персонажа А
в строке.
Вот выражение во всей его славе:
/a/.test("abc"); //true /a/.test("bcd"); //false /a/.test("cba"); //true
Выражение делает то, что мы просим, «ищите A
в строке под тестом». В нашем случае ABC
и BCA
У нас есть персонаж А
Отказ Но BCD
не имеет этого.
Авария
Сейчас это много косой и обратных челков. Давайте сломаем их.
Мы видели это /выражение/
Как мы строим регулярные выражения. Так что нет вопроса о Slash там. На самом деле, мы можем даже Назначить его переменной и сделать это выглядеть лучше.
Тот же код:
let e=/a/; e.test("abc"); //true e.test("bcd"); //false e.test("cba"); //true
Выражение между косудами – это просто один символ А
в нашем случае. Мы смотрим только этого одного персонажа.
Добраться до нескольких персонажей
Давайте масштабируем решение.
Что, если вы хотите найти более одного персонажа?
Положить их в последовательность. Относиться к ним как подстрока.
Вот пример:
/ab/.test("abacus"); //true /bac/.test("abacus"); //true /abc/.test("abacus"); //false /abas/.test("abacus"); //false
Тест строки должен содержать точное выражение в скольжениях. Мы получаем матч, если это условие выполнено.
BAC
находится в пределах abacus
Но Абас
не в abacus
Как это так. Несмотря на то, что у нас есть эти персонажи, охватываемые, мы не получаем точное совпадение.
Обзор земли покрыл
Символ /.../
Отказ Slash (/) отмечает начало и конец регулярного выражения. Игнорируйте точки, вот где мы размещаем шаблон. /A/
Персонаж между скользями – это шаблон, сопоставляющийся на тесте строки. /abc/
Символы между косаями воспринимаются как подзаконная строка во время теста, соответствующего шаблону на тесте строки.
2. Узор в числах
Давайте немного настигда. Допустим, вы хотите узнать, если строка полна числовых символов.
Вот:
let e=/0|1|2|3|4|5|6|7|8|9/; e.test("42"); //true e.test("The answer is 42"); //true
Прежде всего, шаблон выглядит довольно долго. Но такая же длинная полоса персонажей может быть выражено всего лишь двух персонажей Отказ Я зарезервировал его к концу этого раздела для драматического закрытия.
Второй случай не должен быть правдой. Мы будем иметь дело с ним немного позже.
На данный момент символ трубы ( |
) означает или Отказ Вне регулярных выражений мы использовали его как побитовые или и условное или с двойными трубами (
Я мог бы назвать это легко и называть это в день. Но вы бы кричали за что-то лучше, верно? Мы разработчики. Мы проводим лучшую часть нашего дня, думая о лучших псевдонимах Bash и Git, чтобы сэкономить несколько нажатий клавиш.
Должен ли я ввести в девять символов труб? Неа.
Это снова мы:
e=/[0123456789]/; e.test("42"); //true e.test("The answer is 42"); //still true
Это лучше. 9 труб были заменены на 2 квадратных скобках. 7 символов были сохранены. Это на 77,7% меньше нажатий на клавише.
Кстати, все в квадратных скобках считается Либо это
или что
Отказ Это набор символов. В нашем случае строка должна содержать либо 0
или 1
или 2
или … Медведись со мной, я обещал себе написать 1000 слов в день или 3
или 4
или 5
Отказ Хорошо, давайте остановимся. Ты понял.
Что ты сказал? Это все еще выглядит довольно длинно? Не удовлетворены?
Хорошо, вот мы снова идем:
e=/[0-9]/; e.test(42); //true e.test("42"); //true e.test("The answer is 42"); //true!
Как насчет этого? Выглядит очень чище, не так ли? Что-нибудь в квадратных скобках []
означает или Отказ 0-9
отмечает диапазон, смысл ноль до девяти.
Таким образом, тест ищет персонажей от нуля до девяти в тестовой строке.
Как видите, тест тоже принимает числа.
Префикс и паттерны суффикса
Давайте теперь обратимся к тому, что не удается вторым случаем. Ответ 42
соответствует нашему тесту, потому что наш шаблон ищет числовые символы где-то внутри строка. Не начать закончить Отказ
Давайте принесем ^
и $
чтобы помочь нам.
^
означает Начать строки. Он двойной агент, и он пройдет нас. Его второй аватар разоблачен только в последнем разделе.$
означает конец строки.
Давайте получим шаблон префикса:
/^a/.test("abc"); //true /^a/.test("bca"); //false /^http/.test("https://pineboat.in"); //true /^http/.test("ftp://pineboat.in"); //false
Любой шаблон, который следует ^
должно быть в начале строки под тестом.
Вторая строка начинается с B
Пока наш шаблон ищет А
Отказ Четвертый ищет http
пока строка начинается с поправка
Это причина, по которой они терпят неудачу.
Паттерны суффикса
Делавит шаблон суффикса. $
В конце шаблона направляет тест, чтобы искать конец строки.
/js$/.test("regex.js"); //true /js$/.test("regex.sj"); //false
Это должно звучать в вашей голове, как: «Ищите JS
, а затем конец струны». Еще лучше, – ищите строку, которая заканчивается js
“.
Шаблон совпадения заканчивается до конца
Это проложено дорогу к матчу шаблона, начните заканчиваться, вы также можете вызвать его конец.
let e=/^[0-9]$/ e.test("42"); //false - NO! e.test("The answer is 42"); //false e.test("7"); //true
Удивительно, что первый не удался, когда мы добавили ^
и $
Отказ
/^ [0-9] $/
Читает как, «Перейти к началу строки. Ищите одно числовое число от набора символов. Проверьте, заканчивается ли строка прямо там». Вот почему последняя запись вернулась правда
Отказ Это всего лишь одно число, начать закончить.
Это не то, что мы хотели. Мы хотели проверить, имел ли строка одной или несколькими цифрами.
Мы очень близки. Последнее, что нам нужно учиться, это инструктировать рисунку искать более одного символа в комплекте.
Сказка о трех мушкетерах
Вопросительный знак ( ?
), плюс ( +
) и звездочка ( *
) встретились на боевой площадке. Каждый по-разному достопримечал.
Смиренный знак вопроса ( ?
) говорит: «Я не вижу ни один или только один».
Плюс ( +
) говорит: «Мне нужно увидеть хотя бы один или несколько».
Звездочка ( *
) говорит: «Я получаю тебя обоим. Я не вижу, один или больше или больше».
Один из них умно скрывает то, о чем он способен.
Вопросительный знак получает на сцене первым:
/a?/.test(""); //true /a?/.test("a"); //true /a?/.test("b"); //true! /a?/.test("aa"); //true /^a?$/.test("aa"); //false
- Соответствует пустой строке
""
как?
обозначает 0 или 1 - Матчи
А
один матч - Матчи
B
Соответствует 0 вхождении - Матчи
АА
Один матч и второйА
не является частью шаблона /^ a? $/
не совпадаетАА
Это ищет ноль или одинА
, начать закончить, ничего больше, ничего меньше
Плюс ( +
) смотрит на вопросительный знак и замечания: «Я впечатлен, но ваш фокус такой бинарный!». И делает сцену, чтобы показать:
/a+/.test("a"); //true /a+/.test("aa"); //true /a+/.test("ba"); //true! /^a+$/.test("aa"); //true /a+/.test(""); //false /a+/.test("b"); //false /^a+$/.test("ab"); //false
Помните, что плюс ( +
) сказал? Это может сопоставить одно или несколько вхождений предыдущего шаблона.
Все те возвращаются правда
иметь один или несколько А
Отказ Нам даже удалось получить целую строку, составляю только А
В последнем, который вернулся с /^ a + $/
Отказ
ложь
должен иметь смысл сейчас, но слово на последнем, который вернул ложь. /^ a + $/
ищет А
Начните заканчивать, никакие другие символы не допускаются. Вот почему AB
не удалось проверить тест.
Наконец, звезда ( *
) шоу получает на сцене. Он может похвастаться тем, что «я могу поединить один или дуэль или поединку сразу», и говорит: «Я могу соответствовать нулю, одному или нескольким».
/a*/.test("a"); //true /a*/.test("aa"); //true /a*/.test("ba"); //true /a*/.test(""); //true /a*/.test("b"); //true /^a*$/.test("aa"); //true /^a*$/.test(""); //true /^a*$/.test("ab"); //false
Кроме последнего, * смог справиться со всем остальным. /^ a * $/
читается как, 0 или более А
начать закончить. Вот почему пустая строка ""
прошел тест и «АБ»
не смогли.
Вернуться к универсальному ответу
Помните, где были мы, прежде чем мы встретили три мушкетера? Да, «Ответ 42».
Теперь, если нам нужно будет искать только цифры, один или несколько, начать закончить, что мы делаем?
//Let's throw in a plus let e=/^[0-9]+$/ e.test("4"); //true e.test("42"); //true e.test("The answer 42"); //false - Hurray
Знак плюс ( +
) в [0-9] +
приходит к нашему спасению. Плюс означает более одного вхождения персонажа или шаблона перед ним. В нашем случае более одного цифра.
Это также не проходит матч для нашего последнего случая Ответ 42
Потому что в начале строки нет цифр.
Практические шаблоны
- Можете ли вы попытаться написать шаблон для шестнадцатеричных чисел (состоящий из цифр 0-9 и букв A-F, с необязательным # спереди)?
- Как насчет двоичного номера? Можете ли вы проверить, если строка полна всего 0 и 1?
Этот драматический конец
О, я почти забыл. [0-9]
Подписывается для любого чирического набора символов, а также имеет сокращенную версию \ D
Отказ
let e=/^\d+$/; e.test("4"); //true e.test("42"); //true e.test("The answer 42"); //false - Hurray
Всего два персонажа, обозначающие цифры. И нет, это не становится короче, чем это.
Есть целый куча таких специальных шаблонов, чтобы указать кластеры, такие как цифры ( \ d
), буквенные символы альфа ( \ w
), белые пробелы ( \ s
).
Рассмотрение
[123]
Выражение в квадратных скобках – набор символов Любой из символов Match пройдет тест. Только один персонаж.[0-9]
Ищет одну цифровую цифру от 0 до 9[0-5]
Ищет одну числовую цифру от 0 до 5[A-Z]
Ищет одну букву от A до Z[A-F]
Ищет одну букву от A до f[123] +
Плюс (+
) ищет одно или несколько вхождений символов в установленном наборе, который соответствует подкоранию «23132», которая состоит из 1, 2 и 3 в большей строке «ABC23132».|.
Символ трубы обозначает или же\ D
Снаряжение для цифр Соответствует одной цифрельной цифре.\ D
Снаряжение для нециклических символов Все, кроме цифр, которые будут сопоставлены\ D.
3. Рецитарное совпадение, чтобы найти дубликаты
Это фактическая проблема, которую я пытался решить. Я готовлю глубоко в регулярных выражениях, которые в конечном итоге привели к этому посту.
Вам дали строку. Узнайте, если он был наполнен дублирующимися символами перед закатом.
Вот решение для дубликатов символов, появляющихся сразу после возникновения:
let e=/(\w)\1/; e.test("abc"); //false e.test("abb"); //true
Выражение не соответствует какой-либо части строки ABC
По мере того, как в последовательности нет дубликатов символов. Так что возвращает ложь.
Но это соответствует BB
Часть струны ABB
и возвращает правда.
Идите вперед, введите это на вашей консоли Devtool. Посмотри на это!
Давайте сломаемся до понятных произведений.
Backslash \ Unleashed
Я был немного тихим о обратной косуфе, который был введен в последнем разделе. Тем, у кого есть был там и сделал это , это не было неожиданным. Они могли бы иметь сбежал путаница. Но если вы новичок в мире программирования, вам нужно узнать больше о Backslash.
На регулярном языке экспрессии обратная косание особенное. Обратная каша изменяет значение персонажей, которые следуют за ними. Звонить в звонок?
Что вы звоните \ N
Когда вы столкнулись в строке? Да, новая линия. У нас есть что-то похожее здесь.
На самом деле, \ N
Это то, что вы используете в виде шаблона, если вы хотите искать новую строку. Это называется сбежать
обычное значение N
и давая ему целую новую одежду под названием Новая линия
Отказ
\ D
Снаряжение для цифр Соответствует одной цифровой цифре\ D
Снаряжение для нециклических символов Все, кроме цифр, которые будут сопоставлены\ D.
\ S
Снаряжение для одного белого пространства, такого как пространство, новая линия или вкладка.\ S
Антоним\ S
все, кроме белого пространства\ W
. Снаряжение для альфа-числового символа Соответствует A-Z, A-Z, 0-9 и подчеркивание _.\ W
. Антоним\ W.
Сгротные матчи
Мы начали этот раздел с решением для поиска дубликатовных символов. /(\ w) \ 1/
соответствует "АББ"
Отказ Это показывает использование памяти и вспоминает в регулярных выражениях.
Рассмотрим использование брекетов в этом формате (выражение)
Отказ Результирующая строка, которая соответствует выражению в кронштейне, запоминается на более позднее использование.
\ 1
Помнит и использует матч из первого выражения, который находится в скобках. Аналогично, \ 2
от второго набора скобок. И так далее.
Давайте переведем наше выражение (\ W) \ 1
Для простого английского:
Сопоставьте любой альфа-числовой символ на данной строке. Помните это как \ 1
Отказ Проверьте, появится ли этот символ прямо рядом с первым вхождением.
Расширение 1 – Обратные пары
Допустим, мы хотим найти два персонажа, появляющихся в обратном порядке, прямо рядом друг с другом. Это как Абба
Отказ AB
перевернут как BA
и находится рядом друг с другом.
Вот выражение:
let e=/(\w)(\w)\2\1/; e.test("aabb"); //false e.test("abba"); //true e.test("abab"); //false
Первый (\ W)
матчи А
и помнит это как \ 1
Отказ Второй (\ W)
матчи B
и помнит это как \ 2
Отказ Тогда выражение ожидает \ 2
произошло сначала, а затем \ 1
Отказ Следовательно, Абба
является единственной строкой, которая соответствует выражению.
Расширение 2 – нет дубликатов
На этот раз мы будем смотреть на последовательность персонажей без дубликатов. Ни один характер не следует следовать тому же персонажу. Легко и просто.
Здесь взгляните на решение:
let e=/^(\w)(?!\1)$/; e.test("a"); //true e.test("ab"); //false e.test("aa"); //false
Не тот, который мы хотели, но близко. Средний не должен быть ложным. Но мы бросили еще несколько символов, которые нужно объяснить. Это значит снова противостоять самую мощному мушкетеру.
Возврат вопросительного знака
Помните три мушкетера, которые мы встретились ранее. Скромный Вопросительный знак на самом деле самый мощный манипулятор Это может получить другие символы, чтобы сделать его торги. То есть, если вы возьмете обратную косание как должное.
Комбинация кронштейнов, вопросительного знака и восклицательной марки (?!)
называется смотреть в будущее Отказ Отрицательный взгляд заранее быть точным. A (?! B)
матчи А
только если это не затем B
Отказ
Через JavaScript Ecosystem, восклицательный знак означает не Отказ Но его двоюродные CSS принимает U-поворот и ! Важный
Значит, это на самом деле очень важно и не должно быть переопределено. Я почти прокрутил мимо Tweet Chen думать, что это помечено не важно. Я отвлекся.
С другой стороны, (? =)
положительный смотреть в будущее Отказ A (? = B)
матчи А
только если оно сопровождается B
Отказ
У нас было решение. (\ W) (?! \ 1)
ищет персонаж без рецидива. Но только для одного персонажа. Нам нужно группировать его и искать 1 или более вхождений персонажей с использованием плюс ( +
). Это все.
let e=/^((\w)(?!\1))+$/; e.test("madam"); //false e.test("maam"); //false
Но это не так, кажется, работает. Если мы группируем шаблон в рамках скобки, как ((\ w) (?! \ 1))
, \ 1
не представляет (\ W)
Он представляет собой более высокий уровень кронштейна на уровне, которые группируют шаблон. Так что это терпит неудачу.
Что нам нужно, это забывчивый вариант группировки. Вот где знак вопроса, ?
, ударяет назад. Это пары с толстой кишки, (?:)
и вытирает любую функцию памяти, что кронштейны могут принести.
В последний раз:
let e=/^(?:(\w)(?!\1))+$/; e.test("madam"); //true e.test("maam"); //false
На этот раз первый уровень скобок не помнит, благодаря ?:
, следовательно, \ 1
Помнит матч, возвращенный \ W
. Отказ
Это помогает нам использовать плюс +
Против общего группировки, чтобы найти подобные пары персонажей начинают до конца, что работает как магия.
На английском языке «ищите персонажа. Посмотрите вперед, чтобы убедиться, что он не следует тот же персонаж. Сделайте это от начала до конца для всех персонажей».
Рассмотрение
\ W
. представляет все буквы альфа-цифры Если вы получаете выгоду от выгодывания и используете\ W '
это будет означать все персонажи кроме альфа-числовой()
Выражение внутри кронштейна запоминается на более позднее\ 1
помнит и использует матч из первого выражения, который находится в скобках\ 2
от второго набора скобок. И так далее.A (?! B)
Комбинация кронштейнов, вопросительного знака и восклицательного знака (?!
), называется смотреть в будущее Это соответствуетА
только если это не затемпреступник
A (? = B)
Другая сторона монеты МатчА
только если оно сопровождаетсяB
Отказ(?: а)
Забывая группировка ИщитеА
Но не помню это Вы не можете использовать\ 1
Узор, чтобы повторно использовать этот матч
4. Переменная последовательность
Успециаз проста. Сопоставьте строку, использующую только два символа. Эти два персонажа должны чередовать на протяжении всей длины строки. Два образца тесты для «ABAB» и «Xyxyx» будут делать.
Это было нелегко. Я ошибся по нескольким попыткам. Это Ответ направил меня по правой улице.
Вот решение:
let e=/^(\S)(?!\1)(\S)(\1\2)*$/; e.test("abab"); //true e.test("$#$#"); //true e.test("#$%"); //false e.test("$ $ "); //false e.test("xyxyx"); //false
Это где вы говорите: «Мне хватило!» и бросить полотенце.
Но подожди момента ага! Вы находитесь в 3 фута от золотой руды, а не подходящее время, чтобы прекратить копать.
Давайте сначала имеем смысл из результатов, прежде чем мы приедем на « как? ‘ abab
Спички. $ # $ #
Матчи, это не отличается от abab
Отказ
# $%
Не удается, так как есть третий характер. $ $
Не удается, хотя они пары, потому что пространство исключается в нашем рисунке.
Все хорошо, кроме, xyxyx
Не удается, потому что наш шаблон не знает, как справиться с этим последним х. Мы доберемся туда.
Давайте посмотрим на инструменты, добавленные в наш ремень. Это начнет иметь смысл в ближайшее время.
Один кусок за раз
Вы уже знаете большую часть кусочки. \ S
противоположность \ S
Отказ \ S
Ищет не белые космические персонажи.
Теперь наступает обычная английская версия /^ (\ S) (?! \ 1) (\ s) (\ 1 \ 2) * $/
Отказ
- Начните с начала
/^
- Ищите небелый космический персонаж
(\ S)
- Помните это как
\ 1.
- Посмотрите вперед и посмотрите, следует ли первый персонаж не тот же персонаж
(?! \ 1)
Отказ Помните, что это Отрицательный взгляд впереди Отказ - Если мы доброй доброй, ищите другого персонажа
(\ S)
- Помните это как
\ 2.
- Тогда ищите 0 или более пар первых двух матчей
(\ 1 \ 2) *
- Ищите такой рисунок до конца струны
$/
Примените это к нашим тестам. «Абеб»
и «$ # $ #»
матч.
Хвостовый конец
Посмотрев решение, вы можете подумать, что это не требует отдельного раздела. Но простота ее элегантна. Давайте починить, что один из строев xyxyx
Отказ Как мы видели, последний трейлинг X – проблема. У нас есть решение для Xyxy
Отказ Все, что нам нужно, это шаблон, чтобы сказать «искать дополнительное возникновение первого персонажа».
Как обычно, давайте начнем с решения.
let e=/^(\S)(?!\1)(\S)(\1\2)*\1?$/; e.test("xyxyx"); //true e.test("$#$#$"); //true
Вопросительный знак снова поражает. Нет, избегая его. Лучше, мы делаем его нашим союзником, чем нашим врагом. Вопрос Марк ?
После символа или шаблона означает 0 или 1 матч для предыдущего шаблона. Это не жадные в соревновании персонажей.
В нашем случае \ 1?
Средства, 0 или 1 матч первого символа, вспоминаемый через первый набор скобок.
Легкий. Расслабиться.
Рассмотрение
\ S
Представляет всех персонажей, исключая белое пространство, такое как пространство и новые линии Обратите внимание, что это столицаA *
Звездочка или звезда, ищет 0 или более вхождений предыдущего характера. В этом случае это 0 или болееА
Помните плюс (+
), который ищет 1 или более? Да, эти парни – двоюродные братья.A (?! B)
Эта комбинация кронштейнов, вопросительного знака и восклицательного знака (?!
) называется смотреть в будущее Отказ Это соответствуетА
только если оно не за ними BОтказ
Например, он соответствует Ав
АА,
топор,
$Но не совпадает
ABХотя он использует кронштейн, он не помнит соответствующий символ после
АОтказ
\ SМаленькие колпачки S
соответствует одному дизайну белого пространства, такого как пространство или новая линия.
A (? = B)Это соответствует А
За ним следует
BОтказ
^ ab * $Вы можете подумать, что это переводит на 0 или более вхождений AB
, но это соответствует
Асопровождаемый 0 или более
BНапример: это соответствует
ABBB,
Аи
AB, но не совпадает
абабль^ (ab) * $
Это соответствует 0 или более парам AB
Это означает, что он будет соответствовать пустой строке
“”,
ABи
abab, но не
abb.а?
?
Соответствует 0 или 1 вхождении предыдущего характера или шаблона
\ 1?Соответствует 0 или 1 рецидиве первого запоминающегося матча
5. Сопоставьте адрес электронной почты
Предупреждение для производства
Одним из только регулярных выражений могут не помочь проверить электронные письма. Некоторые даже утверждают, что регулярные выражения не должны использоваться, так как он никогда не может сопоставить 100% электронных писем.
Подумайте обо всех необычных доменных именах, появляющихся. Также рассмотрите включение символов в адреса электронной почты, такие как DOT (.) И PLUS (+).
Вам нужно проверить электронную почту дважды. Один раз на стороне клиента, чтобы помочь пользователям избежать неправительственных адресов. Начните с семантического входного тега типа <тип ввода = 'Emai
l ‘>. Некоторые из браузеров автоматически проверяют его без каких-либо дополнительных сценариев на переднем конце.
Проверьте его еще раз на сервере, фактически отправляя подтверждение электронной почты.
Разве вы не видели одного такого в последнее время? Просто попробуйте подписаться на это сосновая лодка Отказ Вы получите реальную электронную почту, прося вас подтвердить, что это ваш. Это подтверждение является сплошным доказательством того, что ваша электронная почта действительна.
Это было гладким парусом, не так ли?
Regex для электронной почты
Теперь, когда мы добавили отказ от ответственности, вы действительно хотите увидеть образец правильно? Нет, найдите регулярное выражение для адреса электронной почты. Один такой результат от модуль Perl идет на более чем страницу.
Итак, я даже не собираюсь попробовать это. Такие длинные регулярные выражения генерируются компьютерами через шаблонные строители. Не за простые смертные, как мы.
6. Сопоставьте сильный пароль
Если вы являетесь кофейным человеком, это правильное время, чтобы получить сильный. Потому что мы находимся в последнем разделе этого поста, но до сих пор до сих пор.
Он вводит очень мало новых операторов и узоров. Но он повторно использует много моделей. Как обычно, мы оставляем за собой кратчайшее оптимизированное для последнего.
Диапазон ASCII – лучшая часть этого поста. Потому что я узнал это во время исследования для этого поста.
Теперь проблема. Помните, что регистрационная форма, которая приняла несколько попыток, прежде чем вы сможете удовлетворить свои жесткие требования к паролю? Слабый, хороший, сильный и очень сильный? Да, мы собираемся построить эту проверку.
Пароль должен:
- иметь минимум 4 символа
- содержат строчные буквы
- содержать в верхнем регистре
- содержат номер
- Содержать символ
Это сложный. Как только вы начнете потребляющие письма, вы не можете вернуться, чтобы проверить, соответствует ли они любым другим условиям. Там в ложь наша подсказка. Мы не можем оглядываться назад, но мы можем посмотреть в будущее!
Длина строки
Давайте сначала проверить, если строковый пароль длиной 4 символа. Довольно просто. Использовать Длина
на строке пароля. Сделано, верно? Нет, кому нужно простое решение? Давайте прям это.
//expression with just lookahead //wouldn't consume any character e1=/^(?=.{4,})$/; e1.test("abc") //false e1.test("abcd") //false //after lookahead, //pattern to consume character is needed. e2=/^(?=.{4,}).*$/; e2.test("abc") //false e2.test("abcd") //true
- Вы можете помнить
(? =)
от нашей предыдущей работы на «Нет дубликатов» Это выглядит вперед, используйте Это не потребляет любой символ - Точка (
.
) – интересный персонаж Это значит, Любой персонаж Отказ {4,}
Стенды как минимум 4 предшествующих персонажах без максимального предела\ d {4}
Будет искать ровно 4 цифр\ w {4,20}
Будет выглядеть 4-20 буквенно-цифровыми символами
Давайте переведем /^(?=. (4 ))$/
Отказ «Начните с начала строки. Посмотрите на не менее 4 символов. Не помните матч. Вернитесь к началу и проверьте, закончится ли строка там.
Не звучит правильно. Имеет ли это? По крайней мере, последний бит.
Вот почему мы привезли в вариацию /^(?=. (4)) .*$/
Отказ Дополнительная точка и звезда. Это так читает, – начните с самого начала. Посмотрите на 4 символа. Не помните матч. Вернитесь к началу. Потребляйте все символы, использующие . *
и посмотрите, добиваются ли вы конца нить.”
Это имеет смысл сейчас. Разве это не так ли?
Вот почему ABC
Не удается и ABCD
проходит шаблон.
Хотя бы один номер
Это будет легко.
e=/^(?=.*\d+).*$/ e.test(""); //false e.test("a"); //false e.test("8"); //true e.test("a8b"); //true e.test("ab890"); //true
Начните с начала строки /^
Отказ Посмотрите на 0 или более персонажей ? =. *
Отказ Проверьте, следуйте ли 1 или более номера \ D +
Отказ Как только он совпадает, вернитесь к началу (потому что мы находились в будущем). Потребляйте все символы в строке до конца строки . * $/
Отказ
По крайней мере, одна строчная буква
Это следует тот же шаблон, что и выше.
e=/^(?=.*[a-z]+).*$/; e.test(""); //false e.test("A"); //false e.test("a"); //true
Перевод? Конечно. «Начни с … хорошо». Вместо \ D +
у нас есть [A-Z] +
который является символом набор букв от А
к z
Отказ
Хотя бы одна заглавная буква
Давайте не будем чрезмерно. [A-Z]
вместо [A-Z]
С предыдущего раздела сделаю.
Хотя бы один символ
Это будет сложным. Один из способов соответствовать символам – разместить список символов в наборе символов. /^(?=.*[-+=_)(\*&\^%\$# @!~"'\: ;| \ }] ([/?. >,]+) .*$/. Тест
(«$») Это все символы в наборе персонажа. Правильно сбежал там, где это необходимо. Это займет месяц для меня, чтобы написать это на простом английском.
Итак, чтобы спасти всех нас от вечной боли, вот простой:
//considers space as symbol let e1; e1=/^(?=.*[^a-zA-Z0-9])[ -~]+$/ e1.test("_"); //true e1.test(" "); //true //does not take space let e2; e2=/^(?=.*[^a-zA-Z0-9])[!-~]+$/ e2.test(" "); //false e2.test("_"); //true //the underscore exception let e3; e3=/^(?=.*[\W])[!-~]+$/ e3.test("_"); //false
Подожди, что это ^
приходить снова с середины нет где? Если вы достигли этого далеко, это то, где вы понимаете, что неразрешенные невинные ^
Такие метки запуска строки – двойной агент. Это означает, конец не слишком далеко. Он был разоблачен.
В рамках набора символов ^
Отрицает набор символов. То есть [^ a-z]
означает, любой символ, отличный от А
к z
Отказ
[^ a-za-z0-9]
Затем означает любой символ, отличный от строчных букв, прописных алфавитов и цифр.
Мы могли бы использовать \ W
. вместо длинного набора символов. Но \ W
. Стенды для всех альфа-цифровых символов в том числе подчеркивание _. Как вы можете видеть в третьем наборе примеров выше, это не примет подчеркивание в качестве действительного символа.
Диапазон Charset.
Любопытный случай [! - ~]
Отказ Они стоят рядом друг с другом в клавиатуре, но их значения ASCII по диагонали напротив.
Помните A-Z? A-Z? 0-9? Это не константы. Они на самом деле основаны на диапазоне их значений ASCII.
Ascii таблица имеет 125 символов. Ноль (0) до 31 не имеет отношения к нам. Пространство начинается от 32 до 126, что является тильдой (~). Восклицательный знак 33.
Итак, [! - ~]
Охватывает все символы, буквы и цифры, которые нам нужны. Семя для этой идеи пришла из другое решение к проблеме символов.
Собирать войска
Внедряя все вместе, мы получаем этот красивый кусок регулярного выражения /^(?=. (5,)) (?=.*[AZ]+)(?=.*\\+ )(?=.*[AZ]+)(?=.*[^\\w]) [- ~] + $/
Отказ
Это начинает преследовать и запугивать нас. Хотя мы изучали их индивидуально.
Именно здесь синтаксис для динамически создания объекта выражения здания пригодится. Мы собираемся построить каждую часть отдельно и собрать их позже.
//start with prefix let p = "^"; //look ahead // min 4 chars p += "(?=.{4,})"; // lower case p += "(?=.*[a-z]+)"; // upper case p += "(?=.*[A-Z]+)"; // numbers p += "(?=.*\\d+)"; // symbols p += "(?=.*[^ a-zA-Z0-9]+)"; //end of lookaheads //final consumption p += "[ -~]+"; //suffix p += "$"; //Construct RegEx let e = new RegEx(p); // tests e.test("aB0#"); //true e.test(""); //false e.test("aB0"); //false e.test("ab0#"); //false e.test("AB0#"); //false e.test("aB00"); //false e.test("aB!!"); //false // space is in our control e.test("aB 0"); //false e.test("aB 0!"); //true
Если ваши глаза еще не устали, вы заметили два странного синтаксиса в вышеуказанном коде.
- Один, мы не использовали
/^
вместо этого мы использовали только^
Отказ Мы не использовали$/
Чтобы положить конец выражению, вместо этого просто$
Отказ Причина в том, чтоRegex
Конструктор автоматически добавляет запуск и конечные скольжения для нас. - Два, чтобы соответствовать числам, которые мы использовали
\\ D
вместо обычного\ D
Отказ Это потому, что переменнаяP
это просто нормальная строка в двойных кавычках. Чтобы вставить обратную косание, вам нужно избежать самой обратной косания.\\ D
решает\ D
в пределахRegex
конструктор
По-видимому, также должны быть проверки на стороне серверов для паролей. Подумайте о уязвимах SQL впрыска, если ваша рамка или язык уже не справится.
7. Заключение
Это приносит нас до конца истории. Но это начало путешествия.
Мы только что поцарапали сопоставленную часть Regex с Тест
метод. exec
Метод основывается на этом фундаменте, чтобы вернуть соответствующие подкрутки на основе шаблона.
Струнный объект имеет такие методы, как Матч
, Поиск
, заменить
и Сплит
Это широко использует регулярные выражения.
Надеюсь, что вы устроили вас, чтобы исследовать эти возможности дальше с твердом пониманием на составных шаблонов для Regex.
8. Призыв к действию
Нет, после всей этой трудности мы прошли, я не собираюсь попросить вас подписаться.
Просто сделайте хорошее программное обеспечение.
Если какие-либо кодовые блоки представлены здесь, не работают, оставьте комментарий к этому Выпуск GitHub Я создал специально для этого поста.
Надеюсь, это было полезно! Поделитесь этим, если другие выиграют.
Вы были замечательными. Ценю ваше время. Этот контент далеко от недавних стандартов. Спасибо за прочтение.
Первоначально опубликовано в www.pineboat.in Отказ