LLM, такие как ChatGPT, могут быть мощными переводчиками между естественными языками и формальными языками, специфичными для предметной области. Яркой иллюстрацией этой возможности являются регулярные выражения.

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

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

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

Пример 1. Совпадение с любым IP-адресом в заданной подсети

^120\.11\.20\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$

Объяснение шаблона регулярного выражения:

  • ^: утверждает начало строки.
  • 120\.11\.20\.: соответствует первым трем октетам IP-адреса (120.11.20).
  • (?:: Начинает группу без захвата.
  • 25[0-5]: Соответствует числам от 250 до 255.
  • |: Чередование, действует как оператор «ИЛИ».
  • 2[0-4]\d: Соответствует числам от 200 до 249.
  • |: Чередование, действует как оператор «ИЛИ».
  • [01]?\d\d?: Соответствует числам от 0 до 199, допуская необязательные ведущие нули.
  • ): закрывает незахватывающую группу.
  • $: подтверждает конец строки.

Это регулярное выражение будет соответствовать любому IP-адресу в указанной подсети от 120.11.20.0 до 120.11.20.255.

Пример 2. Совпадение с адресом электронной почты

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Объяснение шаблона регулярного выражения:

  • ^: утверждает начало строки.
  • [a-zA-Z0-9._%+-]+: соответствует одному или нескольким буквенно-цифровым символам, точкам, символам подчеркивания, знакам процента, плюсам или дефисам в локальной части адреса электронной почты.
  • @: соответствует символу '@'.
  • [a-zA-Z0-9.-]+: соответствует одному или нескольким буквенно-цифровым символам, точкам или дефисам в имени домена.
  • \.: соответствует периоду.
  • [a-zA-Z]{2,}: соответствует двум или более буквенным символам в домене верхнего уровня (TLD).
  • $: подтверждает конец строки.

Предупреждение. Это регулярное выражение охватывает многие основные форматы адресов электронной почты. Однако адреса электронной почты могут быть более сложными, чем этот шаблон, и шаблон может не охватывать все действительные адреса электронной почты. Для проверки адресов электронной почты в соответствии со спецификациями RFC 5322 вам потребуется более сложный шаблон регулярных выражений или специальная библиотека проверки электронной почты.

Примеры 3. Соответствие итальянскому фискальному коду

Итальянский фискальный код, также известный как «Codice Fiscale», представляет собой уникальный идентификатор, присваиваемый отдельным лицам и компаниям для целей налогообложения. Он состоит из 16 знаков: 6 букв фамилии, 6 букв имени, 2 цифр года рождения, 1 буквы месяца рождения, 2 цифр дня рождения и 1 буквы места рождения.

^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$

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

Пример 4. Совпадение с любым HTML-тегом

<\s*\/?\s*[\w-]+(\s+[\w-]+\s*(=\s*("[^"]*"|'[^']*'|[^>\s]+))?\s*)*\/?\s*>

Предостережение. Это регулярное выражение будет соответствовать большинству тегов HTML, включая самозакрывающиеся теги и теги с атрибутами. Однако важно отметить, что регулярные выражения обычно не рекомендуются для синтаксического анализа HTML, поскольку HTML может быть сложным и нерегулярным. Вместо этого рассмотрите возможность использования библиотеки синтаксического анализа HTML или синтаксического анализатора DOM для работы с документами HTML.

Пример 5. Соответствие базовым SQL-запросам

(?i)(SELECT\s[\w\*\)\(\,\s]+\sFROM\s[\w]+)|(UPDATE\s[\w]+\sSET\s[\w\,\'\=]+)|(INSERT\sINTO\s[\d\w]+[\s\w\d\)\(\,]*\sVALUES\s\([\d\w\'\,\)]+)|(DELETE\sFROM\s[\d\w\'\=]+)

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

Пример 6: Соответствие любой строке JSON

^\s*(\{(?:\s*"(?:\\.|[^"\\])*"\s*:\s*(?:"(?:\\.|[^"\\])*"|null|true|false|\d+(\.\d+)?(?:[eE][+-]?\d+)?)(?:\s*,\s*"(?:\\.|[^"\\])*"\s*:\s*(?:"(?:\\.|[^"\\])*"|null|true|false|\d+(\.\d+)?(?:[eE][+-]?\d+)?))*\s*)?\})\s*$

Предостережение. Сопоставление любой строки JSON с одним регулярным выражением затруднено и не рекомендуется из-за сложности и вложенной структуры JSON. Лучший подход для проверки или анализа JSON — использовать специальную библиотеку JSON на вашем языке программирования.

Бонусный пример: Генерация случайных данных для заданного RegEx

Generate random data for this expression:

^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$

Ответ ChatGPT: Похоже, это регулярное выражение соответствует доменным именам. Вот скрипт Python, который генерирует случайные доменные имена, соответствующие этому регулярному выражению:

import random
import string

def random_domain_name():
    domain_length = random.randint(3, 7)
    tld_length = random.randint(2, 6)
    domain = ''.join(random.choices(string.ascii_letters + string.digits, k=domain_length))
    tld = ''.join(random.choices(string.ascii_lowercase, k=tld_length))
    return f"{domain}.{tld}"

# Generate 10 random domain names
for _ in range(10):
    print(random_domain_name())

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

Бонусный пример №2: Редактирование данных

Write a regular expression to match phone numbers
and use it to redact all but the 4 last digits

Ответ ChatGPT: Вот регулярное выражение, соответствующее различным форматам номеров телефонов:

(?:\+?\d{1,3}[-\s.]?)?\(?(?:\d{1,4}\)?[-\s.]?)?\d{1,4}[-\s.]?\d{1,4}([-.\s]\d{1,4})?

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

Это регулярное выражение можно использовать для редактирования телефонных номеров, оставляя видимыми только последние четыре цифры. Вот пример на Python:

import re

def redact_phone_numbers(text):
    pattern = r'(?:\+?\d{1,3}[-\s.]?)?\(?(?:\d{1,4}\)?[-\s.]?)?\d{1,4}[-\s.]?\d{1,4}([-.\s]\d{1,4})?'
    return re.sub(pattern, lambda match: f"REDACTED-{match.group(0)[-4:]}", text)

text = "Call me at +1 (555) 123-4567 or at 555-6789 ext. 1234."
redacted_text = redact_phone_numbers(text)
print(redacted_text)