Когда я пошел в школу Flatiron, я узнал много нового о кодировании / программировании. Было много заграничных концепций, над которыми мне приходилось разбираться и разбираться как самостоятельно, так и с помощью других. Однако ничто не выглядело более пугающим и ошеломляющим для меня, чем регулярные выражения, обычно называемые регулярными выражениями. Давайте посмотрим на пример регулярного выражения из действительно отличного ресурса RegexBuddy (находится здесь):

/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b/gi

Согласно RegexBuddy, это регулярное выражение - это код, который ищет и сопоставляет только действительные адреса электронной почты. По словам каждого начинающего разработчика, это регулярное выражение выглядит как иностранный язык только для того, чтобы его понимали машины и супер-гениальные программисты. Повсюду повсюду символы и косые черты, и единственный образец, который кто-то может распознать, - это A – Z или 0–9, кроме этого, никаких слов.

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

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

Начнем с того, что регулярные выражения всегда появляются между двумя косыми чертами, но могут иметь флаги (односимвольные буквы, которые мы добавляем) в конце, за пределами второй косой черты. Бывший.:

const regex = /Hello World/i

В общем, то, что мы помещаем между косыми чертами, похоже на поисковый запрос, в этом случае я ищу фразу «Hello World», а «i» - это флаг, который означает, что нам все равно, будут ли буквы являются прописными или строчными буквами («i» означает игнорирование регистра или регистр без учета регистра). Другими словами, строка «hellO WOrlD» прошла бы наш тест на регулярное выражение.

Теперь давайте рассмотрим несколько примеров!

Пример 1

Допустим, вам дана большая строка символов, например генетический код, состоящий только из букв A, T, C и G. Может это выглядит примерно так:

const geneticCode = "ATCGGCACTAGCATTATAGCTATATCGGCGCGCGATATCGATCGCGTATCAGTCGTAGATCGATCGACGATCGTATGCTGTCAGCATTAGCTAGCTAGCTGATTGTGTGTACTAGCTAGCTACGTTATATTCGATCGTGCTAGTACGATCGTAGCTACTACTAGCTAGTCATCGATCGTAGCTGATCGTGCTAGTCGCTAGCATGATCGTACGTGACGATCGTACTCACTATCATCGATACTGACATCATCGATCGATCGATCGTAGCATATCGATCGATCGACGTACGTAGCTGACTGACTATCGACGAACATTAGTGATGACTACGACGATCGAGC"

А затем давайте представим, что мы ищем определенный набор букв, чтобы указать, подвержен ли кто-то высокому риску определенного заболевания или нет. Мы скажем, что шаблон - это «CATTAG», чтобы прояснить этот пример.

Наша задача - выяснить, появляется ли «CATTAG» в этом генетическом коде, и если да, то также выяснить, сколько раз. Итак, давайте проведем поиск по нашей строке с помощью регулярного выражения и получим полезную информацию, используя несколько разных методов:

const dnaRegex = /CATTAG/g
dnaRegex.test(geneticCode) // true
const matches = geneticCode.match(dnaRegex) // ["CATTAG", "CATTAG"]
const totalMatches = matches.length // 2

Так что же здесь произошло? Мы создали регулярное выражение, которое соответствует шаблону «CATTAG», и добавили флаг «g» в конце, который означает глобальный и означает, что он будет возвращать каждый экземпляр «CATTAG», найденный в строке.

В следующей строке мы использовали метод «test» в нашем регулярном выражении и передали ему строку генетического кода. Метод «test» просматривает строку на предмет любых совпадений и, если он находит хотя бы одно совпадение, возвращает «true» и, очевидно, если не находит ничего, возвращает «false».

Подобно методу «test», метод «match» просматривает строку на предмет совпадений, за исключением того, что он возвращает все совпадения в массиве вместо логического значения. В этом случае он вернул два совпадения в массиве.

Последняя строка должна показаться знакомой любому, кто работал с JavaScript. Мы проверяем длину массива, созданного методом «match», эффективно подсчитывая, сколько совпадений в нем.

И теперь у нас есть информация, которую нас попросили извлечь; этот генетический код имеет два совпадения с шаблоном «CATTAG», что, как мы скажем, делает этого кандидата низким риском заболевания, на которое мы тестируем.

Пример 2

На этот раз нам дается целая книга с текстом (в данном случае мы будем использовать абзац из нашей воображаемой книги в демонстрационных целях). Автор хочет изменить имя определенного персонажа, что означает поиск и изменение его / ее имени каждый раз, когда его имя упоминается на протяжении всей книги. Наша задача - изменить имя «Мэтью» на «Итан», за исключением того, что иногда его также называют «Мэтт». Регулярные выражения - наши друзья, и мы можем использовать их здесь, чтобы легко заменить имя этого персонажа, независимо от того, есть ли у него псевдоним.

Вот наш текст (текст Lorem ipsum с добавлением «Matt» и «Matthew»):

const bookText = "Lorem ipsum dolor sit Matthew, consectetur adipiscing elit. Ut euismod erat ante, at viverra tortor vestibulum vitae. In suscipit arcu magna, vel auctor Matthew varius eu. Ut placerat id libero ac sodales. Matt ipsum nisi, ullamcorper at tempus sed, mollis eu libero. Praesent faucibus tortor risus, a rutrum urna mollis at. Integer accumsan orci vitae condimentum facilisis. Sed eu fringilla Matt. Cras sapien ipsum, sollicitudin non sem sed, convallis feugiat quam. Nam Matthew diam vitae odio euismod elementum. Matthew molestie tempor libero sed consequat. Suspendisse mattis commodo lobortis. Sed dapibus aliquet tincidunt. Morbi ut hendrerit nisl. Phasellus tempus nulla pellentesque erat efficitur, ut rhoncus Matthew vestibulum."

И вот как мы собираемся использовать наше регулярное выражение:

const matthewRegex = /Matthew|Matt/g
const newTextWithEthan = bookText.replace(matthewRegex, "Ethan") 
// "Lorem ipsum dolor sit Ethan, ..."

На этот раз произошло несколько новых событий. В регулярном выражении я использовал вертикальную черту («|»), которая в регулярном выражении представляет «или». Другими словами, наше регулярное выражение соответствует каждому экземпляру в тексте имени «Мэтью» или «Matt».

Затем наша вторая константа использует метод «replace», который принимает 2 аргумента, первый - это шаблон, который вы хотите найти, а второй - текст, который вы хотите его заменить.

И мы успешно изменили имя персонажа на «Итан» с помощью регулярных выражений.

Пример 3

В качестве немного более сложного примера предположим, что нас наняла компания, которая хочет, чтобы ее сотрудники создали имя пользователя для своих новых внутренних систем. Компания попросила каждого сотрудника привести свое имя пользователя в соответствие с некоторыми рекомендациями, в том числе, что оно должно начинаться с 4-8 строчных букв, заканчиваться ровно 4 цифрами и использовать 0 символов и пробелов. Наша задача - создать код, который гарантирует, что имя пользователя каждого сотрудника соответствует руководящим принципам компании:

const validUsername = "smith1992"
const invalidUsername1 = "ted3333" // not enough letters
const invalidUsername2 = "frankie12345" // not exactly 4 numbers
const invalidUsername3 = "alex-4321" // includes a symbol
const usernameRegex = /^[a-z]{4,8}\d{4}$/
usernameRegex.test(validUsername) // true
usernameRegex.test(invalidUsername1) // false
usernameRegex.test(invalidUsername2) // false
usernameRegex.test(invalidUsername3) // false

Хорошо, это регулярное выражение выглядит немного сложнее, давайте разберем его по крупицам, чтобы понять, как оно работает:

^ - это символ, который указывает, что строка, которую мы тестируем, должна начинаться с того, что идет после нее, в данном случае [a-z]

[a-z] - скобки позволяют нам делать диапазоны вроде a-z, которые соответствуют любой отдельной букве в нижнем регистре алфавита.

{4,8} - это квантификатор, в котором мы установили нижний предел на 4 и верхний предел на 8, что означает, что мы ищем от 4 до 8 строчных букв.

\ d - это метасимвол, а «d» представляет цифру, поэтому, используя этот метасимвол, мы, по сути, говорим [0–9], однозначное число от 0 до 9.

{4} - мы снова используем квантификатор, чтобы сообщить нам, сколько однозначных чисел нужно искать. В прошлый раз мы хотели использовать диапазон от 4 до 8, на этот раз нам нужно ровно 4 цифры, поэтому нам не нужны верхний и нижний предел.

$ - знак доллара напротив ^ означает, что строка, которую мы тестируем, должна заканчиваться тем, что идет прямо перед ней, в данном случае 4 числа.

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

Заключение

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

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