Learning Regular Expressions

regex

111591 просмотра

1 ответ

I don't really understand regular expressions. Can you explain them to me in an easy-to-follow manner? If there are any online tools or books, could you also link to them?

Автор: Teifion Источник Размещён: 29.07.2019 02:51

Ответы (1)


753 плюса

The most important part is the concepts. Once you understand how the building blocks work, differences in syntax amount to little more than mild dialects. A layer on top of your regular expression engine's syntax is the syntax of the programming language you're using. Languages such as Perl remove most of this complication, but you'll have to keep in mind other considerations if you're using regular expressions in a C program.

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

Начните с простого

Концептуально, самые простые регулярные выражения - это буквальные символы. Шаблон Nсоответствует символу «N».

Регулярные выражения рядом друг с другом соответствуют последовательностям. Например, шаблон Nickсоответствует последовательности «N», за которой следует «i», затем «c» и «k».

Если вы когда-либо использовали grepв Unix - даже если только для поиска обычных строк - вы уже использовали регулярные выражения! (The reв grepотносится к регулярным выражениям.)

Заказать из меню

Добавляя небольшую сложность, вы можете сопоставить 'Nick' или 'Nick' с шаблоном [Nn]ick. Часть в квадратных скобках является классом символов , что означает, что он соответствует точно одному из вложенных символов. Вы также можете использовать диапазоны в классах символов, поэтому [a-c]соответствует либо «a», либо «b», либо «c».

Шаблон .является особенным: вместо того, чтобы соответствовать только буквальной точке, он соответствует любому символу . Концептуально то же самое, что и действительно большой класс персонажей [-.?+%$A-Za-z0-9...].

Думайте о классах персонажей как о меню: выберите только один.

Полезные ярлыки

Использование .может сэкономить много печатать, и есть другие ярлыки для общих шаблонов. Скажем, вы хотите сопоставить цифру: один способ написать это [0-9]. Цифры являются частой целью совпадения, поэтому вы можете вместо этого использовать ярлык \d. Другие \s(пробельные символы) и \w(символы слова: буквенно-цифровые или подчеркивания).

Варианты в верхнем регистре являются их дополнениями, поэтому, например, \Sсоответствует любому символу, не являющемуся пробелом.

Один раз недостаточно

Оттуда вы можете повторить части вашего шаблона с квантификаторами . Например, шаблон ab?cсоответствует 'abc' или 'ac', потому что ?квантификатор делает подшаблон, который он изменяет, необязательным. Другие квантификаторы

  • * (ноль или более раз)
  • + (один или несколько раз)
  • {n}(ровно n раз)
  • {n,}(не менее n раз)
  • {n,m}(не менее n раз, но не более м раз)

Соединяя некоторые из этих блоков, шаблон [Nn]*ickсоответствует всем

  • Ик
  • Ник
  • Ник
  • Nnick
  • nNick
  • nnick
  • (и так далее)

Первый матч демонстрирует важный урок: *всегда удается! Любой шаблон может соответствовать нулю раз.

Несколько других полезных примеров:

  • [0-9]+(и его эквивалент \d+) соответствует любому неотрицательному целому числу
  • \d{4}-\d{2}-\d{2} совпадает с датами в формате 2019-01-01

группирование

Квантификатор изменяет шаблон слева от него. Можно было бы ожидать , 0abc+0чтобы соответствовать «0abc0», «0abcabc0», и так далее, но картина сразу слева от плюс квантор c. Это означает 0abc+0совпадение с «0abc0», «0abcc0», «0abccc0» и т. Д.

Чтобы сопоставить одну или несколько последовательностей «abc» с нулями на концах, используйте 0(abc)+0. Скобки обозначают подшаблон, который может быть количественно определен как единица измерения. Механизмам регулярных выражений также свойственно сохранять или «захватывать» часть входного текста, которая соответствует группе в скобках. Извлечение битов таким способом гораздо более гибко и менее подвержено ошибкам, чем подсчет индексов и др substr.

перемежаемость

Ранее мы видели один способ сопоставления «Ника» или «Ника». Другой с чередованием, как в Nick|nick. Помните, что чередование включает в себя все слева и все справа. Использование группирования скобки для ограничения объема |, например , (Nick|nick).

Для другого примера вы могли бы эквивалентно написать [a-c]как a|b|c, но это, вероятно, будет неоптимальным, потому что многие реализации предполагают, что альтернативы будут иметь длину больше 1.

Спасаясь

Хотя некоторые персонажи соответствуют друг другу, другие имеют особое значение. Шаблон \d+не соответствует обратной косой черте, за которой следует строчная буква D с последующим знаком плюс: чтобы получить его, мы будем использовать \\d\+. Обратная косая черта удаляет специальное значение из следующего символа.

Жадность

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

Например, скажем, вход

«Привет, - сказала она, - как дела?»

Вы можете ожидать ".+"совпадения только с «Hello», а затем будете удивлены, когда увидите, что оно совпадает с «Hello» на всем протяжении «you?»

Чтобы переключиться с жадного на то, что вы можете считать осторожным, добавьте дополнительный ?в квантификатор. Теперь вы понимаете, как работает \((.+?)\)пример из вашего вопроса. Он соответствует последовательности буквальной левой круглой скобки, за которой следуют один или несколько символов и оканчивающейся правой круглой скобкой.

Если вы введете «(123) (456)», то первый захват будет «123». Нежадные квантификаторы хотят, чтобы остальная часть шаблона начала сопоставление как можно скорее.

(Что касается вашей путаницы, я не знаю ни одного диалекта регулярного выражения, где ((.+?))бы делали то же самое. Я подозреваю, что что-то потеряно при передаче где-то по пути.)

Якоря

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

Скажем, вы хотите сопоставить комментарии формы

-- This is a comment --

ты бы написал ^--\s+(.+)\s+--$.

Построй свой собственный

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

Инструменты для написания и отладки регулярных выражений:

книги

Бесплатные ресурсы

сноска

†: Вышеупомянутое утверждение, которое .соответствует любому символу, является упрощением для педагогических целей, которое не является строго верным. Точка соответствует любому символу, кроме новой строки, "\n"но на практике вы редко ожидаете, что шаблон .+пересекает границу новой строки. В регулярных выражениях Perl есть /sпереключатель и Java Pattern.DOTALL, например, для .соответствия любому символу. Для языков, которые не имеют такой функции, вы можете использовать что-то вроде [\s\S]соответствия «любому пробелу или любому непробелу», другими словами, чему угодно.

Автор: Greg Bacon Размещён: 03.05.2010 04:09
Вопросы из категории :
32x32