Обычные Выражения, также известные как REGEX, — это метод применения формул для управления текстом. REGEX позволяет вам искать и фильтровать фрагменты текста и извлекать только желаемое. Его также можно использовать для проверки строки символов на определенные функции. Например, это MAC-адрес, номер мобильного телефона или номер ISBN? REGEX — чрезвычайно мощный инструмент, который часто применяется к формам и базам данных, поскольку он может помочь контролировать как ввод, так и вывод.

В Части 8 мы использовали REGEX для управления вводом номера ISBN.

#”^[0–9xX\-]+$”

REGEX следовал шаблону #”filter” . Фильтр обычно начинается с ^, обозначающего начало строки, и $, обозначающего конец строки. Квадратные скобки [ ] содержат определенный шаблон REGEX. Для нашего ISBN нам нужны были все цифры и буква X как в верхнем, так и в нижнем регистре. Кроме того, нам требовался дефис -. Чтобы убедиться, что мы получили буквальный дефис, а не команду вычитания, мы использовали escape-символ. Управляющий символ представлен обратной косой чертой \.

Управляющий символ используется, чтобы указать компьютеру использовать следующий символ нестандартным способом. Например, буква n просто интерпретируется как символ n. Однако, если мы экранируем букву n с помощью обратной косой черты \, теперь мы получаем новую строку \n.

Возвращаясь к нашему объяснению REGEX, мы видим непосредственно перед знаком доллара $ +. Символ + указывает на один или несколько. Затем фигурные скобки используются для указания количества экземпляров предыдущего шаблона. Например, когда нам нужно было создать фильтр года, мы использовали {3}.

#”^[12][0–9]{3}$”

Для приведенного выше шаблона Year [0–9] — любое число. Если бы мы хотели, вместо 0–9 мы могли бы также использовать \d для указания целых десятичных чисел. Таким образом, [0–9]{3} — это любое трехзначное число, например 496. Что также можно записать как [\d]{3}.

Рассмотрим следующее:

(re-find #”\d+” “abc12345def678”)
“12345”

Так что же случилось с «678»?

Команда re-find ищет первый экземпляр шаблона REGEX. Следовательно, как только он нашел последовательность чисел (на что указывает #”\d+”, что совпадает с [0–9]+), он остановился. и вернул результат.

Что, если мы хотим найти все числа «12345» и «678»?

Мы можем использовать команду re-seq. Все, что делает re-seq, — это создает ленивый список. В программировании на Clojure термин ленивый подразумевает, что список или последовательность доступны только после применения функции. В нашем случае re-seq — это функция. Поскольку последовательность создается по запросу, это фактическое создание называется реализацией. Некоторые оценки бесконечны, например, PI или треть (повторяющиеся 3,3333). Однако, если оценка дает конечное значение, она называется полностью реализованной.

(re-seq #”\d+” “abc12345def678”)
(“12345” “678”)

Как видите, мы нашли все группы чисел. Однако что, если мы хотим найти все группы чисел и собрать их вместе в одну строку. Например, «12345678».

(apply str (re-seq #”\d+” “abc12345def678”))
“12345678”

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

Давайте посмотрим на другую команду REGEX, re-matches.

(re-matches #”\d+” “12345”)
“12345”
(re-matches #”\d+” “12345a”)
nil

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

Наш новый шаблон rematches будет соответствовать только точному шаблону. Следовательно, nil, когда в строке появляется не число.

В тех случаях, когда вам требуется точное совпадение, рассмотрите возможность повторного сопоставления.

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

(re-matches #”Star.*” “Star Trek”)
“Star Trek”

Здесь мы использовали точку . для обозначения любого символа и звездочки * для ни одного или нескольких вхождений.

Но что, если мы не уверены в этом случае? Рассмотрим следующее.

(re-matches #”(?i)STAR.*” “Star Trek”)
“Star Trek”

По сути, помещая (?i) перед строкой поиска REGEX, мы инициируем поиск без учета регистра. Вы видите, насколько это полезно? Теперь вы можете использовать сокращенный поисковый запрос, игнорирующий регистр.

Применение регулярного выражения

Вспомните из части 8 код, который мы использовали для фильтрации номеров ISBN. Обратите внимание, этот код следует шаблону:

Этот шаблон оператора if можно использовать для решения ряда проблем программирования. В программировании это называется Выделение. Напомним, компьютерную программу можно создать всего из трех элементов: Последовательность, Выделение и Повторение. Наш шаблон выше является примером Selection. Оператор if проверяет условие и, если оно истинно, выполняет зеленую строку. Если false, выполняется красная строка. Опять же, повторяя приведенный выше шаблон, вы получаете мощный инструмент для управления вводом и выводом формы, а также поиском в базе данных и файлах.

РЕЗЮМЕ

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

"Предыдущий"

Часть 10 — Файлы