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

ВАЖНОЕ ПРИМЕЧАНИЕ. Запросы на объяснение шаблона или конструкции регулярного выражения будут закрыты как дубликаты канонического сообщения Что означает это регулярное выражение, которое содержит много деталей о конструкциях регулярных выражений. Сообщение также содержит ссылки на многие популярные онлайн-тестеры регулярных выражений (где можно найти значения конструкций регулярных выражений). Одним из таких инструментов является Regex101.


Регулярные выраженияявляются мощным формализмом для сопоставления с образцом в строках. Они доступны на множестве диалектов (также известных как разновидности) на нескольких языках программирования и инструментах обработки текста, а также во многих специализированных приложениях. Термин «Регулярное выражение» обычно сокращается как «RegEx» или «regex».

Прежде чем задать вопрос, пожалуйста, уделите время ознакомлению со следующими краткими инструкциями.

Как спросить

  • Будьте ясны о том, что вам нужно.

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

    Кроме того, вы ищете регулярное выражение для проверки правильности ввода (которое должно быть довольно строгим), или вам нужно одно для извлечения информации (которое может быть несколько смягчено)?

    Если ваш вопрос относится к регулярным выражениям в строгом смысле информатики / теории автоматов, просьба указать это явно.

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

  • Покажите нам, что вы пытались.

    Ссылка на один из многих инструментов онлайн-тестирования регулярных выражений (см. Раздел ссылок) с вашей попыткой и некоторыми репрезентативными данными может творить чудеса.

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

  • Поиск дубликатов.

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

Избегайте общих проблем и ловушек

  • Не думайте, что используемый вами инструмент поддерживает в точности синтаксис другого инструмента.

    Хотя современная поддержка регулярных выражений Perl / Ruby / Python / PHP / Java широко распространена, нельзя предполагать, что она универсальна. В частности, многие старые инструменты (Awk, sed, grep, lex и т. Д.), А также некоторые более новые инструменты (JavaScript, многие текстовые редакторы) используют разные диалекты, некоторые из которых не обязательно поддерживают, например, не захватывающие скобки (?:...), не жадные квантификаторы *?, обратные ссылки (\1, \2 и т. д.), сокращения классов общих символов (\t, {{ X8}}, классы символов POSIX [[:class:]]), произвольное повторение {m,n}, предвкушение (?=...), (?<=...), (?!...) и т. Д. И т. Д. И т. Д.

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

  • Поймите разницу между выражениями "glob" и истинными регулярными выражениями.

    Шаблоны глобусов- это менее мощный язык сопоставления шаблонов, который обычно используется для подстановочных знаков имени файла. В glob * означает «что угодно», тогда как одиночное * в регулярном выражении фактически является синтаксической ошибкой на некоторых диалектах (хотя многие движки будут молча игнорировать ее, а не выдавать предупреждение и другие все еще увидят его как литерал *).

    Для записи, выражение регулярного выражения (как можно больше) «что-нибудь» - это .*, где метасимвол . «любой отдельный символ (обычно, кроме новой строки)» повторяется ноль или более раз. ( {{Х2}} ) . Но смотрите ниже о том, как «любой характер» и жадность часто проблематичны.

    Смотрите также Каковы различия между стилями глобуса шаблон и регулярное выражение?

  • Указывать одно повторение не нужно.

    Использование {1} в качестве квантификатора однократного повторения безвредно, но никогда не полезно. По сути, это признак неопытности и / или растерянности.

    h{1}t{1}t{1}p{1} соответствует той же строке, что и более простое выражение http (или ht{2}p в этом отношении), но, как вы можете видеть, избыточные {1} повторения только усложняют чтение.

  • Квадратные скобки обычно неправильно понимают или неправильно используют.

    Начинающие часто пытаются использовать квадратные скобки для всего, включая группировку. Хотя [Jun][Jul] может выглядеть как регулярное выражение для совпадающих месяцев, на самом деле оно совпадает с JJ, Ju, Jl, uJ, uu, {{ X6}}, nJ, nu или nl; не Jun или Jul. [Jun|Jul] - расточительный способ написать функционально идентичный [|Junl] - он соответствует любому одному символу из набора, содержащего |, {{ X15}}, u, l и n.

    Для записи [abc] определяет класс символов, который соответствует одному символу, который может быть a или b или c. Правильный способ выражения чередования - (Jun|Jul|Aug) на многих диалектах (хотя BREи связанные диалекты потребуют обратной косой черты ; \(Jun\|Jul\|Aug\) для традиционного grep и др.) Или, несколько более экономно, (Ju[nl]|Aug)

  • Отрицание сложно.

    По сравнению с предыдущим, новички будут использовать отрицательные классы символов, чтобы попытаться ограничить то, что может быть сопоставлено. Например, чтобы соответствовать turn, но не turned, следующее не делает то, что вы хотите: turn[^ed] - оно будет соответствовать turn, за которым следует любой отдельный символ, который не является e или d (например, он не будет совпадать с turner).

    На самом деле, традиционное регулярное выражение не позволяет легко выразить это. С ERE вы могли бы сказать turn($|[^e]|e$|e[^d]), чтобы сказать, что turn не может следовать ни за чем, или за символом, который не является e, или e, если он не находится в очереди затем d. Современные диалекты регулярных выражений имеют расширение под названием lookarounds, которое позволяет вам сказать turn(?!ed) - но убедитесь, что ваш инструмент поддерживает этот синтаксис перед тем, как продолжить.

    Обратите также внимание на то, как оператор отрицания класса символов отличается от начала привязки строки (^[abc] соответствует a, b или c в начале строки, тогда как {{ X4}} соответствует одному символу, который не является a, b или c).

    Смотрите также следующий пункт.

  • Если есть способ сопоставления, двигатель его найдет.

    Общей ошибкой новичка является предоставление бесполезных необязательных начальных или конечных элементов. Конечный s? в dogs? ничего не делает для предотвращения совпадения doggone или endogenous. Если вы хотите предотвратить это, вам нужно уточнить - возможно, что-то вроде dogs?\> (при условии, что ваш диалект поддерживает последний оператор границы слова и при условии, что вы это имеете в виду).

    Таким образом, регулярное выражение dogs? будет точно соответствовать тем же строкам, что и просто dog (хотя, если ваше приложение захватывает совпадение, только первое будет захватывать конечный s, если оно есть ) .

  • Спички жадные.

    Регулярное выражение a.*b будет соответствовать всей строке "abbbbbb", потому что * всегда будет соответствовать максимально возможному. Скажите a[^ab]*b, если вы это имеете в виду, или используйте не жадное совпадение, если ваш диалект поддерживает это.

  • Смотрите, что вы захватываете

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

    Также, в частности, следите за (abc){2,3}, который фиксирует только последнее вхождение abc в соответствующей строке. Если вы хотите, чтобы повторение было частью захвата, оно должно быть в скобках, например: ((abc){2,3})

  • Не используйте регулярные выражения для всего!

    В частности, использование (обычно ориентированных на строки) традиционных инструментов регулярных выражений для обработки структурированных форматов, таких как HTML, XML, JSON, файлов конфигурации с блочной структурой (Apache, nginx, многих серверов имен и т. Д.), Составляет может привести к сбою или дать неправильные результаты в многочисленных угловых случаях.

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

Дальнейшее чтение

Изучение регулярных выражений

Книги

Документация для JavaScript

Онлайн-песочницы (для тестирования и публикации регулярных выражений в сети)

  • RegexPlanet(поддерживает различные вкусы на выбор)
  • Regexpal(разновидность ECMAScript, реализованная в JavaScript)
  • Regexhero(вариант .NET)
  • RegexStorm.net(версия .NET с возможностью обмена ссылками)
  • RegExr v2.1(в JavaScript)
  • RegExr v1.0(разновидность ECMAScript, реализованная в Adobe Flash)
  • reFiddle(на языке JavaScript, как jsFiddle)
  • Rubular(аромат Ruby)
  • myregexp.com(Java-апплет с исходным кодом)
  • regexe.com(немецкий; возможно, Java)
  • regex101(в ECMAScript (JavaScript), Python, PHP (PCRE 16-бит), Golang, генерирует объяснение шаблона)
  • regexper.com(генерирует графическое представление для разновидности ECMAScript)
  • debuggex(генерирует графическое представление и показывает обработку шаблона - совместим с JavaScript, Python и PCRE)
  • pyregex.com(веб-валидатор для регулярных выражений Python)
  • regviz.org(визуальная отладка регулярных выражений для JavaScript)
  • Ultrapico Expresso(автономный инструмент для тестирования регулярных выражений .NET)
  • Pythex(быстрый способ проверки регулярных выражений Python)

Онлайн генератор регулярных выражений (для создания регулярных выражений с помощью упрощенного ввода)

Прочие ссылки

Regex использует:

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

Хотя регулярные выражения были бы полезны для поисковых систем в Интернете, их обработка по всей базе данных может потребовать чрезмерных ресурсов компьютера в зависимости от сложности и структуры регулярного выражения. Хотя во многих случаях системные администраторы могут выполнять запросы на основе регулярных выражений внутри страны, большинство поисковых систем не предлагают поддержку регулярных выражений для широкой публики. Известные исключения: поисковый код или ранее Поиск кода Google, который был закрыт в 2012 году.
Google также предлагает re2(C ++ - быструю, безопасную, ориентированную на потоки альтернативу обратному поиску движков регулярных выражений, подобных тем, что используется в PCRE, Perl и Python): он не возвращается и гарантирует линейный рост времени выполнения с размером ввода.