Questions tagged [регулярные-выражения]

Регулярные выражения в программировании — это формальный язык, описывающий шаблон, по которому в тексте будет осуществлён поиск подстроки. Вместе с этой меткой обязательно указывайте метку реализации регулярных выражений (C#, Java, PHP и тому подобное).

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

  • find — находит одно совпадение,
  • match — возвращает логическое значение, соответствует ли текст шаблону,
  • replace — заменяет найденную подстроку на другой текст.

Большинство современных языков программирования имеют встроенную поддержку регулярных выражений. Среди них Perl, Java, PHP, JavaScript, языки платформы .NET Framework, Python, Tcl, Ruby, Lua, C++ (стандарт 2011 года) и другие.


Как задать вопрос про регулярные выражения

  • Укажите реализацию регулярных выражений (POSIX, PCRE, ECMAScript, Lua и др.)
  • Не нужно пытаться объяснить на пальцах сложными фразами, что Вы хотите получить. Лучше приведите:
    • пример текста, к которому будет применяться регулярное выражение,
    • что Вы хотите получить,
    • что Вы не хотите получить.
  • Ссылки на онлайн-отладчики приветствуются, но внесите необходимые данные в сам вопрос.
  • Даже если Вы плохо разбираетесь в регулярных выражениях, покажите, что Вы пытались и старались. Не следует просто просить написать регулярное выражение за Вас.
  • Не путайте регулярные выражения с шаблонами поиска.
  • Кроме того, для следующих видов задач есть решения получше, нежели регулярные выражения:
    • Разбор разметки HTML, XML, xHTML, WML и проч., вычленения тегов, атрибутов, значений и всего такого следует выполнять специализированными парсерами. Следует учитывать, что парсеры бывают потоковыми (SAX) и строящие дерево (DOM). Первый вид работает эффективнее, но зато вторые могут похвастаться простым интерфейсом.
    • Разбор URL, URI, IRI и иже с ними можно проводить специально заточенными под это библиотеками. Модуль urllib.parse в Python или net/url в Go, класс URI в Java или Uri в C#, функция parse_url в PHP, объект URL или хак с тегом <a> в JavaScript.

Синтаксис регулярных выражений

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

Метасимволы

Это символ или последовательность символов, которые означают не литерал, а имеют специальное назначение: группа литералов, позиция в тексте или являются конструктивным элементом регулярного выражения (это[](){}?|*+).

Позиционные метасимволы

Это метасимволы, которые означают не литерал, а некоторую позицию в тексте по определённым признакам.

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

  • ^ — этот метасимвол означает позицию начала текста. Если регулярное выражение используется с флагом MULTILINE, то этот метасимвол указывает на позицию начала строки многострочного текста.
  • $ — этот метасимвол означает позицию конца текста. Если регулярное выражение используется с флагом MULTILINE, то этот метасимвол указывает на позицию конца строки многострочного текста.
  • \b — граница слова. Словом считаются буквенные литералы, цифры и нижнее подчёркивание, идущие подряд. Границы слова, соответственно, находятся слева и справа от слова. В тексте .мама. .мыла. .раму. границы слов обозначены точками.
  • \B — НЕ граница слова м.а.м.а м.ы.л.а р.а.м.у,
  • \G — позиция конца предыдущего совпадения. Если текущее совпадение — первое, то это позиция начала текста.

Метасимволы группы литералов

Такие метасимволы являются синонимом для символьного класса, например, метасимвол \d равносилен символьному классу [0-9]. При этом метасимволы можно указывать внутри символьных классов. [\dabc] равносильно [0-9abc]. Один метасимвол, обозначающий группу литералов, совпадает в тексте ровно с одним литералом, если к нему не применена квантификация.

  • . — любой символ, кроме символа переноса строки \n. Если регулярное выражение используется с флагом DOT_ALL, то это любой символ. Внутри символьного класса обозначает литерал «точка».
  • \d — цифра. Аналогично [0-9],
  • \D — НЕ цифра. Аналогично [^0-9],
  • \w — буква, цифра или знак нижнего подчёркивания [A-Za-z0-9_],
  • \W — НЕ буква, цифра или знак нижнего подчёркивания,
  • \s — пробельный символ. Любой пробельный символ Unicode или [\f\n\r\t\v ], если текст не в кодировке Unicode.
  • \S — НЕ пробельный символ,
  • \h — горизонтальный пробельный символ, без новой строки
  • \r — возврат каретки,
  • \n — перевод строки,
  • \t — горизонтальная табуляция,
  • \v — вертикальная табуляция,
  • \f — конец страницы,
  • \b — литерал «забой» внутри символьного класса. Вне символьного класса это метасимвол границы слова.
  • \0 — литерал «NULL» (пустой символ).
  • \xhh
  • \uhhhh
  • \chh

Экранирование

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

Регулярное выражение \(\.\) задаёт последовательность литералов (.).

Квантификаторы (кванторы)

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


Полезные ссылки

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

Онлайн-отладка

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

  • regex101.com PCRE (PHP), JavaScript, Python;
  • debuggex.com PCRE, JavaScript, Python (создает графическую иллюстрацию);
  • regexr.com JavaScript (есть готовая рыба), PCRE;
  • regexplanet.com Go, Haskell, Java, JavaScript, .NET, Perl, PHP, Python, Rubi, Tcl, XRegExp;
  • uiregex.com PCRE (PHP, JavaScript) — онлайн-генератор;
  • functions-online.com PHP — генератор функций.

Вопросы и ответы, с которыми полезно ознакомиться

5260 questions
13
votes
2 answers

Регулярные выражения: включить и исключить символы

Можно-ли используя регулярные выражения сделать так, чтобы включить все буквы: [a-z], но исключить некоторые, например [^ite]. То есть в итоге должно получиться что-то вроде: [a-z] & [^ite]. Сейчас приходит в голову два раза проверять символ на…
phpusr
  • 133
9
votes
1 answer

Использование вертикальной табы(\v), жадных(Greedy) и супержадных выражений

Что такое вертикальная таба \v? Чем супержадный метод отличается от жадного? Аналогично для нежадного. Не надо меня отсылать к гуглу (или lmgfy). Если хочется послать, пошлите лучше на "natribu" или на конкретный сайт с описанием проблемы для…
knes
  • 25,879
8
votes
3 answers

Регулярное выражение для русского автомобильного номера

помогите переделать регулярку для парсинга 9-и значного автомобильного номера (для 8-и значного нашел) формат 8-и значного: аХХХааХХ формат 9-и значного: аХХХааХХХ Где а - буквы русского алфавита, Х - цифры Для 8-и…
6
votes
1 answer

Выбрать одно из заданных слов

Мне нужно определить в строке одно из N заданных слов. Для примера возьмём такие: zero, .one, two Частично с этим помогает справиться такое выражение: /\b(?:zero|\.one|two)\b/ Но есть одна проблема: оно не определяет .one, так как оно начинается с…
Kir_Antipov
  • 4,642
5
votes
3 answers

Как получить содержимое круглых и фигурных скобок первого уровня?

Я имею следующую структуру: (Q){(W){g}(E){z}} Мне необходимо достать то, что находится в круглых и фигурных скобках первого уровня. Т.е. Q и (W){g}(E){z} Пробовал "\((.+?)\){.*?}" но это обрезает последнюю фигурную скобку.
Kojan
  • 85
5
votes
1 answer

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

Простой вроде вопрос. Что означает регулярка "a^b" и можно ли ее найти в какой либо строке? import re p = re.compile("a^b") p.search("ab") --> None p.search("a^b") --> None p.search("a\nb") --> None Если такое выражение действительно не…
andy.37
  • 7,461
5
votes
1 answer

Регулярное выражение захватывает слишком много текста

Есть HTML ....
....
Регулярка (.*)
возвращает полностью код, содержащий 2 таблицы сразу. Как запросить, чтобы регулярка вернула каждую таблицу по…
5
votes
1 answer

Поиск с помощью регулярных выражений

Всем привет! "Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems!" (c) Jamie Zawinski Помогите найти всех "кошек" через регулярные выражения! :)
let's try to find this cat…
4
votes
1 answer

Помогите объединить регулярное выражение

Пытаюсь сделать минипарсер формулы, на выходе должно быть 5 групп: (1)(2)(3)(4)(5) Есть 3 возможных варианта: Если после буква заглавная, то после неё может следовать 'w', вторая группа в этом случае пустая: ([2-3]?)()([ACD]{1})([w]?)([2']?) Во…
Isaev
  • 2,455
4
votes
2 answers

Знак ? в регулярном выражении

Вопрос такой: Что означает первый знак ? слева в скобках \.(?i:gif|jpe?g|png)$
4
votes
4 answers

Регулярное выражение для чисел с плавающей точкой

Есть регулярка ^([0-9]*\.[0-9]+)$, как сделать чтобы она пропускала числа с плавающей точкой и запятой?
rodgers
  • 388
4
votes
1 answer

Как определить необязательный параметр в регулярном выражении

(vk.com\/video_ext.php\?oid=([\d]+)&id=([\d]+)&hash=([a-z0-9 ]+)((&hd=[\d])|(sd)+)) как сделать, так, чтобы регулярка срабатывала при наличии и отсутствии на конце ((&hd=[\d])|(sd)+)
aliokero
  • 736
4
votes
3 answers

Regexp соответствующий любому набору символов до первого вхождения подстроки

Например: строка - "все вот это досюда, а дальше там еще много всего досюда". Подстрока, до которой надо вывести все - "досюда", получить надо "все вот это ".
4
votes
4 answers

Поиск слов с помощью регулярных выражений

Как составить регулярное выражение на поиск слов(а) в тексте при условии, что данное слово появляется более n-раз. Пример. Ищем слово 'world', которое встречается ровно 3 и более раза Hello my world Hello my world, hello my world, hello my…
lolokot
  • 320
4
votes
1 answer

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

Как составить регулярное выражение для проверки, что строка отвечает следующим требованиям: Цифры от 1-4 Нельзя повторять одинаковые цифры Можно использовать только запятые Пока получилось что-то типа этого, но оно позволяет использовать цифры…
1
2 3
40 41