Разное

Перевод строки регулярные выражения: Регулярные выражения, пособие для новичков. Часть 1 / Хабр

Содержание

20 коротких шагов для освоения регулярных выражений. Часть 4

RegEx: 20 коротких шагов для освоения регулярных выражений. Часть 1
RegEx: 20 коротких шагов для освоения регулярных выражений. Часть 2
20 коротких шагов для освоения регулярных выражений. Часть 3

Эта, заключительная часть, в ее середине коснется таких вещей, которыми пользуются в основном мастера регулярных выражений. Но вам же легко давался материал из предыдущих частей, ведь правда? Значит и с этим материалом вы справитесь с той же легкостью!

Оригинал здесь
Шаг 16: группы без захвата (?:)В двух примерах на предыдущем шаге мы захватывали текст, который в действительности нам не нужен.

В задаче «Размеры файлов» мы захватили пробелы перед первой цифрой размеров файлов, а в задаче «CSV» мы захватили запятые между каждым токеном. Нам не нужно захватывать эти символы, но нам нужно использовать их для структурирования нашего регулярного выражения. Это идеальные варианты для использования группы без захвата, (?:).
group: 1111

(Пример)

Вы можете создать именованную группу захвата с помощью (?…) или (?’name’…) синтаксиса (.NET-совместимое регулярное выражение) или с таким синтаксисом (?P…) или (?P’name’…) (Python-совместимое регулярное выражение). Поскольку мы используем PCRE (Perl-совместимое регулярное выражение), которое поддерживает обе версии, мы можем использовать любой из них здесь. (Java 7 скопировала синтаксис .NET, но только вариант с угловыми скобками. прим. переводчика)

Чтобы повторить именованную группу захвата позже в регулярном выражении, мы используем \ или \k’name’ (.NET) или (?P=name) (Python). Опять же, PCRE поддерживает все эти различные варианты. Вы можете прочитать больше об именованных группах захвата здесь, но это была большая часть того, что вам действительно нужно знать о них.
Задачка нам в помощь:
Используйте обратные ссылки, чтобы помочь мне вспомнить … эммм … имя этого человека.

pattern: 
string:  "Hi my name's Joe." [later] "What's that guy's name? Joe?". 
group:                 111    

(Решение)
Шаг 18: взгляд вперед (lookahead) и взгляд назад (lookbehind)
Сейчас мы углубимся в некоторые расширенные функции регулярных выражений. Всё, вплоть до шага 16, я использую довольно часто. Но эти последние несколько шагов предназначены только для людей, которые очень серьезно используют regex для сопоставления очень сложных выражений. Другими словами, мастера регулярных выражений.

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

pattern: (\w+)(?=!)
string:  I like desk. 
group:                                             1111    

(Пример)

Вы можете видеть, как указанная выше группа захвата (\w+), которая обычно соответствует любому из слов в отрывке, соответствует только слову lamp. Положительный «взгляд вперед» (?=!) означает, что мы можем сопоставлять только те последовательности, которые заканчиваются на ! но, на самом деле, мы не сопоставляем сам символ восклицательного знака. Это важное различие, потому что с группами без захвата мы сопоставляем символ, но не захватываем его. С помощью lookaheads и lookbehinds мы используем символ для построения нашего регулярного выражения, но затем мы даже не сопоставляем его с ним самим. Мы можем сопоставить его позже в нашем регулярном выражении.

Всего существует четыре вида lookaheads и lookbehinds: положительный взгляд вперед (?=…), отрицательный взгляд вперед (?!…), положительный взгляд назад (?. . Здесь может помочь регулярное выражение, использующее простой взгляд назад:

pattern: (?<=\. 
group:                  11111       11111       11111    

(Решение)

Предположим, что мы очищаем базу данных и у нас есть столбец информации, который обозначает проценты. К сожалению, некоторые люди записали числа в виде десятичных значений в диапазоне [0,0, 1,0], в то время как другие написали проценты в диапазоне [0,0%, 100,0%], а третьи написали процентные значения, но забыли литерал знак процента %. Используя отрицательный взгляд вперед (?!…), можете-ли вы пометить только те значения, которые должны быть процентами, но в которых отсутствуют знаки %? Это должны быть значения, строго превышающие 1,00, но без конечного % . (Ни одно число не может содержать более двух цифр до или после десятичной точки.)

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

pattern: 
string:  0.32 100.00 5.6 0. 
group:        111111 111                1111            11111 1111    

(Решение)
Шаг 19: условия в регулярных выражениях
Сейчас перешли к тому этапу, когда большинство людей уже не станут использовать регулярные выражения.

Мы рассмотрели, вероятно, 95% сценариев использования простых регулярных выражений, и все, что делается на шагах 19 и 20, обычно выполняется более полнофункциональным языком манипулирования текстом, таким как awk или sed (или языком программирования общего назначения). Тем не менее, давайте продолжим, просто чтобы вы знали, на что действительно способно регулярное выражение.

Хотя регулярные выражения не являются полными по Тьюрингу, некоторые движки регулярных выражений предлагают функции, которые очень похожи на полный язык программирования.
Одна из таких особенностей является «условием». Условные выражения Regex допускают операторы if-then-else, где выбранная ветвь определяется либо «взглядом вперед», либо «взглядом назад», о которых мы узнали на предыдущем шаге.

(Решение)
Шаг 20: рекурсия и дальнейшее обучение
На самом деле, есть очень много всего, что можно втиснуть в 20-шаговое введение в любую тему, и регулярные выражения не являются исключением.

Существует множество различных реализаций и стандартов для регулярных выражений, которые можно найти в Интернете. Если вы хотите узнать больше, я предлагаю вам посетить замечательный сайт regularexpressions.info, это фантастический справочник, и я, конечно, многое узнал от туда о регулярных выражениях. Я настоятельно рекомендую его, а также regex101.com для тестирования и публикации ваших творений.

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

Простые рекурсии довольно просты, но давайте подумаем, что это значит в контексте регулярного выражения. Синтаксис простой рекурсии в регулярном выражении записывается так: (?R)? . Но, конечно, этот синтаксис должен появляться внутри самого выражения. То что мы сделаем, это вложим выражение в себя, произвольное количество раз.
group: 11111 1111111111 1111111111

(Пример)

Поскольку вложенное выражение является необязательным ((?R) сопровождается ?), то самое простое совпадение — просто полностью игнорировать рекурсию. Итак, hey, а затем oh совпадает (heyoh). Чтобы сопоставить любое более сложное выражение, чем это, мы должны найти эту совпадающую подстроку, вложенную внутрь себя в той точке выражения, в которую мы вставили (?R) последовательность. Другими словами, мы могли бы найти heyheyohoh или heyheyheyohohoh, и так далее.

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

Элементы языка регулярных выражений — краткий справочник



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

2023 © Все права защищены. Карта сайта