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

Содержание

Глава 16. Регулярные выражения

При поиске и создании правил сегментации используются регулярные выражения, поддерживаемые платформой Java. Более подробную информацию можно найти в документации Java. Ниже приведены несколько примеров и ссылок.

Примечание

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

Таблица 16.1. Регулярные выражения — Модификаторы

Выражение … соответствует
(?i) Включает поиск совпадений независимо от регистра символов (по умолчанию все шаблоны чувствительны к регистру)

Таблица 16.

2. Регулярные выражения — Символы

Выражение … соответствует
x Символ «x», за исключением следующих случаев…
\uhhhh Символ с шестнадцатеричным значением 0xhhhh
\t Символ табуляции («\u0009»)
\n Символ новой строки («\u000A»)
\r Символ возврата каретки («\u000D»)
\f Символ конца страницы (команда подачи страницы для принтера) («\u000C»)
\a Символ звонка (оповещения) («\u0007»)
\e Символ Escape («\u001B»)
\cx Управляющий символ, соответствующий «x»
\0n Символ с восьмеричным значением 0n (0 ≤ n ≤ 7)
\0nn
Символ с восьмеричным значением 0nn (0 ≤ n ≤ 7)
\0mnn Символ с восьмеричным значением 0mnn (0 ≤ m ≤ 3, 0 ≤ n ≤ 7)
\xhh Символ с шестнадцатеричным значением 0xhh

Таблица 16. {|} в качестве их буквальных значений. \\ Например, это будет обратная косая черта. \Q

не соответствует ничему, только экранирует все символы вплоть до \E \E не соответствует ничему, только прекращает экранирование, начатое \Q

Таблица 16.4. Регулярные выражения — Классы блоков и категорий Юникода

Выражение … соответствует
\p{InGreek} Символ из греческого блока (простой блок)
\p{Lu}
Прописная буква (см. abc] Любой символ кроме a, b, или c (исключение)
[a-zA-Z] Любые символы латинского алфавита, от a до z и от A до Z включительно

Таблица 16.6. Регулярные выражения — Предустановленные наборы символов

Выражение … соответствует
.
Любой символ (кроме символов конца строки)
\d Цифра: [0-9]
\D Не цифра: [^0-9]
\s Любой пробельный символ: [ \t\n\x0B\f\r]
\S Любой не пробельный символ: [^\s]
\w Любой буквенный или цифровой символ, а также знак подчёркивания: [a-zA-Z_0-9]
\W Любой символ кроме буквенного и цифрового, а также знака подчёркивания: [^\w]

Таблица 16. Начало строки $ Конец строки \b Граница слова \B Не граница слова

Таблица 16.8. Регулярные выражения — Жадные кванторы

Выражение … соответствует
X? X, один раз или ни разу
X* X, ноль или более раз
X+ X, один или более раз

Примечание

жадные кванторы будут искать как можно больше совпадений. Например, a+ для последовательности aaabbb выдаст «ааа».

Таблица 16.9. Регулярные выражения — Ленивые кванторы

Выражение … соответствует
X?? X, один раз или ни разу
X*? X, ноль или более раз
X+? X, один или более раз

Примечание

ленивые кванторы будут искать как можно меньше совпадений. Например, a+? для последовательности aaabbb выдаст только a.

Таблица 16.10. Регулярные выражения — Логические операторы

Выражение … соответствует
XY X, за которым идёт Y
X|Y Либо X, либо Y
(XY) XY как отдельная группа

1. Инструменты для работы с регулярными выражениями и примеры использования

Существует несколько программ для разработки и тестирования регулярных выражений. В общем и целом они работают по одному и тому же принципу (пример работы программы Regular Expression Tester смотри ниже): регулярное выражение (в верхнем поле) применяется к некоему тексту (в поле посередине), результаты работы показываются в нижнем поле.

Рисунок 16.1. Regex Tester

Программа The Regex Coach для Windows, GNU/Linux и FreeBSD. Работает по описанному выше принципу.

Большое количество полезных примеров регулярных выражений можно найти и в самой ОмегаТ (смотри «Параметры» > «Сегментация»). В списке ниже приведены регулярные выражения, которые могут оказаться полезными при поиске по памяти перевода:

Таблица 16.11. Регулярные выражения — Примеры использования регулярных выражений при поиске по переводам

Регулярное выражение Результат поиска:
(\b\w+\b)\s\1\b слова, написанные дважды
[\. aeiou] для английского языка: проверка подобная предыдущей, но на слова, начинающиеся с согласных («a», а не «an»)
\s{2,} больше, чем один пробел подряд
\.[A-Z] Точка, за которой следует прописная буква, возможно, перед началом нового предложения пропущен пробел?
\bis\b поиск «is», но не «this» или «isn’t» и т. д.

Регулярные выражения — Википедия

Материал из Википедии — свободной энциклопедии

Регуля́рные выраже́ния (англ. regular expressions) — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ.  wildcard characters). Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.

Возможности

Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации регулярных выражений для обработки текстов. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них ActionScript, Perl, Java[1],PHP, JavaScript, языки платформы .NET Framework[2], Python, Tcl, Ruby, Lua, Gambas, C++ (стандарт 2011 года), Delphi, D, Haxe и другие.

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

  • найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета», «терракотовый»;
  • найти отдельно стоящее слово «кот» и заменить его на «кошка»;
  • найти слово «кот», которому предшествует слово «персидский» или «чеширский»;
  • убрать из текста все предложения, в которых упоминается слово кот или кошка.

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

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

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

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

История

Истоки регулярных выражений лежат в теории автоматов, теории формальных языков и классификации формальных грамматик по Хомскому[3].

Эти области изучают вычислительные модели (автоматы) и способы описания и классификации формальных языков. В 1940-х гг. Уоррен Маккалок и Уолтер Питтс описали нейронную

Спецсимволы в регулярных выражений

Вы здесь: Главная — PHP — PHP Основы — Спецсимволы в регулярных выражений

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

Чтобы Вас долго не томить, привожу таблицу с описанием спецсимволов в регулярных выражениях.

Спецсимвол Что делает
\d Возникает соответствие, если данный символ является цифрой.
\D
Возникает соответствие, если данный символ является НЕ цифрой.
\w Возникает соответствие, если данный символ является буквой, либо цифрой.
\W Соответствие возникнет, если данный символ НЕ является буквой, либо цифрой.
\s Соответствие появится, если символ будет пробельным.
\S Соответствие будет, при условии, что данный символ НЕ будет пробельным.
\b Соответствует позициии на границе слова.
\B Соответствует позиции НЕ на границе слова.
\n Соответствует символу перехода на новую строку.
\t Соответствует символу табуляции.
\r Соответствует символу возврата каретки.

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

/\d\s\w\d/

Переведите на русский язык данное выражение… А теперь проверьте себя. Строка, которая «содержит последовательность, которая начинается с цифры, после которой идёт пробельный символ, далее идёт буква, либо цифра и затем ещё одна цифра.«, будет соответствовать регулярному выражению, написанному выше.

Теперь постарайтесь придумать строку, которая будет соответствовать данному регулярному выражению. Я же приведу свой пример: «

не_важно_что0 a9не_важно_что«, либо такая «0 99» и другие аналогичные строки.

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

  • Создано 07.04.2011 23:41:21
  • Михаил Русаков
Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:
    <a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так:

  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):
    [URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]

Введение в регулярные выражения в JavaScript

Введение

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

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

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

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

Если с помощью JavaScript вы хотите создать регулярное выражение (описать шаблон), есть два способа это сделать.

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

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

Второй параметр — строка с флагами (flags). Не волнуйтесь, скоро мы с ними познакомимся. Этот параметр необязательный. Стоит запомнить одно: после создания регулярного выражения флаги уже нельзя будет добавить или убрать. Поэтому, если хотите использовать флаг, добавьте его на этапе создания выражения.

// Синтаксис конструктора регулярных выражений
new RegExp(pattern[, flags])

// Создание регулярного выражения
// с помощью конструктора
// без флагов
const myPattern = new RegExp('[a-z]')

// Создание регулярного выражения
// с помощью конструктора
// с одним флагом
const myPattern = new RegExp('[a-z]', 'g')
Литерал регулярных выражений

Второй способ — использование литерала. Как и конструктор, литерал регулярных выражений состоит из двух частей. Первая часть — это описываемый шаблон. Он заключается в слэши (//). После закрывающего слэша идёт вторая часть — флаги. Они необязательны.

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

// Создание регулярного выражения
// с помощью литерала
// без флагов
const myPattern = /[a-z]/

// Создание регулярного выражения
// с помощью литерала
// с одним флагом
const myPattern = /[a-z]/g

Примечание: два слэша в литерале регулярных выражений используются для того, чтобы заключить в них шаблон. Если ваш шаблон предполагает использование ещё одного или нескольких прямых слэшей, их необходимо экранировать обратным слэшем (\), то есть \ /.

Конструктор или литерал?

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

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

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

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

test()

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

// Синтаксис метода test()
// /шаблон/.test('проверяемый текст')


// Проверка строки,
// когда test() не находит совпадений
myPattern.test('There was a cat and dog in the house.')
// false


// Создание переменной,
// которой присваивается текст для проверки
const myString = 'The world of code.'


// Создание шаблона
const myPattern = /code/


// Проверка текста с помощью шаблона,
// когда test() находит совпадение
myPattern.test(myString)
// true
exec()

Ещё один метод, который можно использовать — exec(). Если есть совпадение, метод exec() возвращает массив. Массив содержит в себе информацию об используемом шаблоне, позиции, на которой было найдено совпадение, проверяемом тексте и наборах. Если совпадений нет, метод exec() возвращает null.

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

// Синтаксис метода exec()
// /шаблон/.exec('проверяемый текст')


// Создание строки для проверки
const myString = 'The world of code is not full of code.'

// Описание шаблона
const myPattern = /code/

// Использование exec() для проверки текста,
// когда exec() находит совпадение
myPattern.exec(myString)
// [
//   'code',
//   index: 13,
//   input: 'The world of code is not full of code.',
//   groups: undefined
// ]


// Описание другого шаблона
const myPatternTwo = /JavaScript/

// Использование exec() с новым шаблоном для новой проверки текста,
// когда exec() не находит совпадений
myPatternTwo.exec(myString)
// null

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

test() и exec() — не единственные методы, которые можно использовать для поиска совпадений строки с шаблоном. Есть ещё search(), match() и matchAll(). Эти методы принадлежат не объекту RegExp, а строкам. Несмотря на это, они позволяют применять регулярные выражения.

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

search()

Первый метод, search(), ищет в строке заданный шаблон. Если он находит совпадение, то возвращает позицию в строке, где это совпадение начинается. Если совпадения нет, возвращается -1. Нужно запомнить, что метод search() возвращает позицию только первого совпадения. После нахождения первого совпадения он прекращает работу.

// Синтаксис метода search()
// 'проверяемый текст'.search(/шаблон/)


// Создание текста для проверки
const myString = 'The world of code is not full of code.'.

// Описание шаблона
const myPattern = /code/

// Использование search() для поиска
//совпадения строки с шаблоном,
//когда search() находит совпадение
myString.search(myPattern)
// -13


// Вызов search() прямо на строке,
// когда search() не находит совпадений
'Another day in the life.'.search(myPattern)
// -1
match()

match() — второй метод объекта String, который позволяет использовать регулярные выражения. Он работает аналогично exec(): при нахождении совпадения метод match() возвращает массив с информацией об использованном шаблоне, позиции в строке, на которой было найдено совпадение, проверяемом тексте и наборах.

Так же как и exec(), match() возвращает null при отсутствии совпадений. При использовании метода match() с флагом g для поиска всех совпадений с шаблоном возвращается массив из всех совпадений.

// Синтаксис метода match()
// 'проверяемый текст'.match(/шаблон/)


// Создание текста для проверки
const myString = 'The world of code is not full of code.'

// Описание шаблона
const myPattern = /code/

// Использование match() для поиска совпадения в тексте
myString.match(myPattern)
// [
//   'code',
//   index: 13,
//   input: 'The world of code is not full of code.',
//   groups: undefined
// ]

'Another day in the life.'.match(myPattern)
// null


// Использование match() для поиска всех совпадений
// Создание текста для проверки
const myString = 'The world of code is not full of code.'

// Описание шаблона
const myPattern = /code/g // добавление флага 'g'

// Использование match() для поиска совпадения в тексте
myString.match(myPattern)
// [ 'code', 'code' ]
matchAll()

Подобно методу match(), matchAll() возвращает все совпадения при использовании флага g в шаблоне. Однако работает он по-другому. Метод matchAll() возвращает объект RegExp String Iterator. Есть несколько способов извлечь из него все совпадения.

Во-первых, можно пройтись по объекту циклом for…of и вернуть или записать все совпадения. Также можно использовать Array.from(), чтобы создать массив из содержимого объекта, или оператор spread, который даст точно такой же результат, как и Array.from().

// Синтаксис метода match()
// 'проверяемый текст'.match(/шаблон/)

// Создание текста для проверки
const myString = 'The world of code is not full of code.'

// Описание шаблона
const myPattern = /code/g
// Обратите внимание, что используется флаг 'g'

// Использование matchAll() для поиска совпадений в тексте
const matches = myString.matchAll(myPattern)

// Использование цикла for...of для получения всех совпадений
for (const match of matches) {
  console.log(match)
}
// [
//   [
//     'code',
//     index: 13,
//     input: 'The world of code is not full of code.',
//     groups: undefined
//   ],
//   [
//     'code',
//     index: 33,
//     input: 'The world of code is not full of code.',
//     groups: undefined
//   ]
// ]


// Использование Array.from() для получения всех совпадений
const matches = Array.from(myString.matchAll(myPattern))
// [
//   [
//     'code',
//     index: 13,
//     input: 'The world of code is not full of code.',
//     groups: undefined
//   ],
//   [
//     'code',
//     index: 33,
//     input: 'The world of code is not full of code.',
//     groups: undefined
//   ]
// ]

// Использование оператора spread для получения всех совпадений
const matches = [...myString.matchAll(myPattern)]
// [
//   [
//     'code',
//     index: 13,
//     input: 'The world of code is not full of code.',
//     groups: undefined
//   ],
//   [
//     'code',
//     index: 33,
//     input: 'The world of code is not full of code.',
//     groups: undefined
//   ]
// ]

Как создавать простые шаблоны?

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

// Создание простого шаблона
// с использованием литерала регулярного выражения
const myPattern = /JavaScript/

// Проверка строки на совпадения с шаблоном
myPattern.test('One of the most popular languages is also JavaScript.')
// true

// Проверка строки на совпадения с шаблоном
myPattern.test('What happens if you combine Java with scripting?')
// false

Как создавать сложные шаблоны со специальными символами?

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

Символьные классы

Символьные классы — это своеобразные сокращения для разных типов символов. К примеру, есть свои классы для букв, цифр, пробелов и т. д.

/* Символьный класс - Значение */
. - любой символ, кроме первой строки
\d - одноразрядное число (то же, что и [0-9])
\w - отдельный буквенно-числовой словообразующий символ из латинского алфавита, включая подчёркивание (то же, что и [A-Za-z0-9_)
\s - отдельный символ разделителя (пробел, табуляция и т.\t\r\n\v\f]).

Примеры:

// . - любой символ, кроме первой строки
const myPattern = /./

console.log(myPattern.test(''))
// false

console.log(myPattern.test('word'))
// true

console.log(myPattern.test('9'))
// true


// \d - одноразрядное число
const myPattern = /\d/

console.log(myPattern.test('3'))
// true

console.log(myPattern.test('word'))
// false

// \w - отдельный буквенно-числовой словообразующий символ
const myPattern = /\w/

console.log(myPattern.test(''))
// false

console.log(myPattern.test('word'))
// true

console.log(myPattern.test('9'))
// true


// \s - отдельный символ разделителя
const myPattern = /\s/

console.log(myPattern.test(''))
// false

console.log(myPattern.test(' '))
// true

console.log(myPattern.test('foo'))
// false


// \D - отдельный нечисловой символ
const myPattern = /\D/
console.log(myPattern.test('Worm'))
// true
console.log(myPattern.test('1'))
// false


// \W - отдельный несловообразующий символ
const myPattern = /\W/

console.re/

console.log(myPattern.test('write'))
// false

console.log(myPattern.test('read'))
// true

console.log(myPattern.test('real'))
// true

console.log(myPattern.test('free'))
// false

// $ - Конец строки
const myPattern = /ne$/

console.log(myPattern.test('all is done'))
// true

console.log(myPattern.test('on the phone'))
// true

console.log(myPattern.test('in Rome'))
// false

console.log(myPattern.test('Buy toner'))
// false


// \b - Граница слова
const myPattern = /\bro/

console.log(myPattern.test('road'))
// true

console.log(myPattern.test('steep'))
// false

console.log(myPattern.test('umbro'))
// false

// Или
const myPattern = /\btea\b/

console.log(myPattern.test('tea'))
// true

console.log(myPattern.test('steap'))
// false

console.log(myPattern.test('tear'))
// false

// \B - Несловообразующая граница
const myPattern = /\Btea\B/
console.log(myPattern.test('tea'))
// false
console.log(myPattern.test('steap'))
// true
console.log(myPattern.test('tear'))
// false

// x(?=y) - Опережающая проверка
const myPattern = /doo(?=dle)/

console.log(myPattern.test('poodle'))
// false

console.log(myPattern.test('doodle'))
// true

console.log(myPattern.test('moodle'))
// false


// x(?!y) - Негативная опережающая проверка
const myPattern = /gl(?!u)/

console.log(myPattern.test('glue'))
// false

console.log(myPattern.test('gleam'))
// true


// (?<=y)x - Ретроспективная проверка
const myPattern = /(?<=re)a/

console.log(myPattern.test('realm'))
// true

console.log(myPattern.test('read'))
// true

console.log(myPattern.test('rest'))
// false

// (?<!y)x - Негативная ретроспективная проверка
const myPattern = /(?<!re)a/

console.log(myPattern.test('break'))
// false

console.log(myPattern.test('treat'))
// false

console.log(myPattern.test('take'))
// true
Квантификаторы

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

/* Квантификатор - Значение */
* - 0 или более совпадений с предшествующим выражением.
+ - 1 или более совпадений с предшествующим выражением.
? - Предшествующее выражение необязательно (то есть совпадений 0 или 1).
x{n} - "n" должно быть целым положительным числом. Количество вхождений предшествующего выражения "x" равно "n".
x{n, } - "n" должно быть целым положительным числом. Количество вхождений предшествующего выражения "x" равно, как минимум, "n".
x{n, m} - "n" может быть равно 0 или целому положительному числу. "m" - целое положительное число. Если "m" > "n", количество вхождений предшествующего выражения "x" равно минимум "n" и максимум "m".

Примеры:

// * - 0 или более совпадений с предшествующим выражением
const myPattern = /bo*k/

console.log(myPattern.test('b'))
// false

console.log(myPattern.test('bk'))
// true

console.log(myPattern.test('bok'))
// true


// + - 1 или более совпадений с предшествующим выражением
const myPattern = /\d+/

console.log(myPattern.test('word'))
// false

console.log(myPattern.test(13))
// true


// ? - Предшествующее выражение необязательно, совпадений 0 или 1
const myPattern = /foo?bar/

console.log(myPattern.test('foobar'))
// true

console.log(myPattern.test('fooobar'))
// false


// x{n} - Количество вхождений предшествующего выражения "x" равно "n"
const myPattern = /bo{2}m/

console.log(myPattern.test('bom'))
// false

console.log(myPattern.test('boom'))
// true

console.log(myPattern.test('booom'))
// false


// x{n, } - Количество вхождений предшествующего выражения "x" равно, как минимум, "n"
const myPattern = /do{2,}r/
console.log(myPattern.test('dor'))
// false
console.log(myPattern.test('door'))
// true
console.log(myPattern.test('dooor'))
// true


// x{n, m} - Количество вхождений предшествующего выражения "x" равно минимум "n" и максимум "m"
const myPattern = /zo{1,3}m/

console.log(myPattern.test('zom'))
// false

console.log(myPattern.test('zoom'))
// true

console.log(myPattern.test('zooom'))
// true

console.log(myPattern.test('zoooom'))
// false
Наборы и диапазоны

Наборы и диапазоны могут пригодиться, когда нужно указать специальные символы набора или их диапазон.b-g]/ console.log(myPattern.test(‘bcd’)) // false (нет других символов, кроме входящих в диапазон от ‘b’ до ‘g’) console.log(myPattern.test(‘jklm’)) // true (есть другие символы, кроме входящих в диапазон от ‘b’ до ‘g’) // (x) — «x», значение запоминается для дальнейшего использования. const myPattern = /(na)da\1/ console.log(myPattern.test(‘nadana’)) // true — \1 запоминает и использует совпадение ‘na’ из первого выражения в скобках. console.log(myPattern.test(‘nada’)) // false // (?<name>x) — Создание именованной скобочной группы, к которой можно обратиться по указанному имени. const myPattern = /(?<foo>is)/ console.log(myPattern.test(‘Work is created.’)) // true console.log(myPattern.test(‘Just a text’)) // false // (?:x) — «x», значение не запоминается. const myPattern = /(?:war)/ console.log(myPattern.test(‘warsawwar’)) // true console.log(myPattern.test(‘arsaw’)) // false

Альтернация

Альтернация позволяет находить соответствие, по крайней мере, одному из нескольких выражений.

/* Альтернация - Значение */
| - выражение до или после символа |, как в булевом ИЛИ (||).

Примеры:

// | - Выражение до или после символа |
const myPattern = /(black|white)swan/

console.log(myPattern.test('black swan'))
// true

console.log(myPattern.test('white swan'))
// true

console.log(myPattern.test('gray swan'))
// false
Флаги

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

/* Флаг - Значение */
g – Глобальный поиск, не останавливается после нахождения первого совпадения.
i – Игнорирование регистра (соответствует верхнему и нижнему регистрам).
s - Точка (.) соответствует переводу на новую строку." и заканчивается "$" (начало и конец каждой строки).

Примеры:

// флаг g - Глобальный поиск
const myPattern = /xyz/g

console.log(myPattern.test('One xyz and one more xyz'))
// true

// флаг i - Игнорирование регистра
const myPattern = /xyz/i

console.log(myPattern.test('XyZ'))
// true - регистр символов не имеет значения при нечувствительном к регистру поиске.

// флаг s - Точка (.) соответствует переводу на новую строку
const myPattern = /foo.bar/s

console.log(myPattern.test('foo\nbar'))
// true

console.log(myPattern.test('foo bar'))
// true

console.log(myPattern.test('foobar'))
// false

Заключение

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

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

Поведение и применение символов регулярных выражений.

Синтаксис регулярных выражений в Python немного отличается от синтаксиса регулярных выражений в языке программирования PERL.

Регулярные выражения могут быть объединены для формирования новых регулярных выражений. Если A и B являются регулярными выражениями, то AB также является регулярным выражением. В общем, если строка p соответствует A, а другая строка q соответствует B , строка pq будет соответствовать AB. Это верно, если только A или B не содержат операций с низким приоритетом — граничные условия между А и В или пронумерованные ссылки на группы. Таким образом, сложные выражения могут быть легко построены из более простых примитивных выражений.

Для получения дополнительной информации смотрите раздел сайта docs-python.ru «Использование регулярных выражений в Python»

Регулярные выражения могут содержать как специальные, так и обычные символы. Большинство обычных символов, таких как 'A', 'a' или '0', являются простейшими регулярными выражениями, они просто соответствуют друг другу. Вы можете объединять обычные символы, поэтому выражение last соответствует строке 'last'.

Некоторые символы, такие как '|' или '(', являются специальными. Специальные символы либо обозначают классы обычных символов, либо влияют на интерпретацию регулярных выражений вокруг них.

Классификаторы, которые осуществляют повтор символов или группы символов '*', '+', '?', {m,n} не могут быть непосредственно вложены. Это позволяет избежать неоднозначности с суффиксом не жадного модификатора '?' и с другими модификаторами в других реализациях. Чтобы применить второе повторение к внутреннему повторению, можно использовать круглые скобки. Например, выражение (?:a{6})* соответствует любому кратному шести символов ‘a’.’ соответствует началу строки, а при включенном флаге re.MULTILINE также соответствует положению сразу после каждой новой строки.

'$'

Специальный символ '$' соответствует концу строки или непосредственно перед новой строкой в ​​конце строки, а при включенном флаге re.MULTILINE также соответствует перед новой строкой . Регулярное выражение foo соответствует как 'foo', так и 'foobar', тогда как регулярное выражение foo$ соответствует только 'foo'. Что еще интереснее, поиск выражения foo.$ в строке 'foo1\nfoo2\n' в обычном режиме совпадет с 'foo2', а в MULTILINE режиме совпадет еще и с 'foo1'. При поиске одиночного $ в строке 'foo\n' будет найдено два пустых совпадения: одно непосредственно перед новой строкой, а другое в конце строки.

'*'

Специальный символ '*' приводит к тому, что результирующее регулярное выражение совпадает с 0 или более повторениями предыдущего регулярного выражения, с максимально возможным количеством повторений. Выражение ab* будет соответствовать 'a', 'ab' или 'a', за которым следует любое количество символов 'b'.

'+'

Специальный символ '+' заставляет результирующее регулярное выражение совпадать с 1 или более повторениями предыдущего регулярного выражения. Выражение ab+ будет соответствовать 'a', за которым следует любое ненулевое число 'b' и не будет соответствовать просто символу 'а'.

'?'

Специальный символ '?' заставляет результирующее регулярное выражение совпадать с 0 или 1 повторениями предыдущего регулярного выражения. Выражение ab? будет соответствовать либо 'а' или 'ab'.

'*?', '+?', '??'

Квалификаторы '*', '+' и '?' являются жадными. Они пытаются захватить как можно больше текста для анализа. Иногда такое поведение нежелательно. Если регулярное выражение <.*> сопоставить с строкой '<a> b <c>', то оно будет соответствовать всей строке, а не только '<a>'. Добавление '?' после квалификатора '*' заставляет выражение выполнять сопоставления нежадным или минимальным образом и будет подобрано как можно меньше символов. Использование регулярного <.*?> выражения будет соответствовать только подстроке '<a>'.

'{m}'

Конструкция '{m}' указывает, что должно быть найдено ровно m копий предыдущего регулярного выражения, меньшее количество совпадений приводит к тому, что все выражение потерпит неудачу. Например, выражение a{6} будет соответствовать ровно шесть символов 'a', а не пять.

'{m,n}'

Конструкция '{m,n}' вызывает совпадение полученного регулярного выражения от m до n повторений предыдущего регулярного выражения, пытаясь сопоставить как можно больше повторений. Например, выражение a{3,5} будет соответствовать от 3 до 5 символов 'a'. Пропуск m указывает нижнюю границу как 0, а пропуск n — бесконечную верхнюю границу. В качестве примера, выражение a{4,}b будет соответствовать подстрока 'aaaab' или тысяча символов 'a', а затем 'b', но не 'aaab'. Запятая не может быть опущена, иначе модификатор будет перепутан с ранее описанной формой.

'{m,n}?'

Конструкция '{m,n}?' вызывает совпадение полученного регулярного выражения от m до n повторений предыдущего регулярного выражения, пытаясь сопоставить как можно меньше повторений. Это не жадная версия предыдущего классификатора. Например, в строке из 6 символов 'aaaaaa' выражение a{3,5} будет соответствовать 5 символам 'a', в то время как выражение a{3,5}? будут совпадать только 3 символа 'a'.

'\'

Специальный символ '\' либо экранирует специальные символы, разрешающие соответствовать символам, таким как '*', '?' и так далее или сигнализирует о специальной последовательности, которые будут обсуждаются ниже.

Если не использовать необработанную строку r'' в написании шаблона регулярного выражения, то необходимо помнить, что Python также использует обратную косую черту в качестве escape-последовательности в строковых литералах. Если escape-последовательность не распознается синтаксическим анализатором Python, обратная косая черта и последующий символ включаются в полученную строку. Если Python распознает полученную последовательность, обратный слеш должен повторяться дважды. Это сложно и трудно понять, поэтому настоятельно рекомендуется использовать необработанные строки r'' для всех, кроме самых простых регулярных выражений.

'[]'

Конструкция '[]' используется для обозначения символьного класса:

  • В символьном классе, символы могут быть перечислены по отдельности, например выражение [amk], будет соответствовать 'a', 'm' или 'k'.
  • Диапазон символов в символьном классе, указываются как два символа с разделяющим их символом '-', например выражение [a-z] будет соответствовать любой строчной ASCII-букве, а выражение [0-5][0-9] будет соответствовать всем двухзначным числам от 00 до 59. Выражение [0-9A-Fa-f] будет соответствовать любой шестнадцатеричной цифре. Если символ '-' экранирован, например [a\-z] или если он помещен как первый или последний символ, например [-a] или [a-], он будет соответствовать литералу '-'.
  • Специальные символы теряют свое особое значение внутри символьного класса. Например выражение [(+*)] будет соответствовать любому из буквенных символов '(', '+', '*' или ')'.
  • Специальные символы, такие как \w или \S также принимаются внутри символьного класса, хотя символы, которым они соответствуют, зависят от того, действует ли режим re. не имеет особого значения, если это не первый символ в символьном классе.
  • Чтобы соответствовать литералу ']' внутри символьного класса, поставьте перед ним обратную косую черту \ или поместите его в начало символьного класса. Например, оба выражения [() [ \ ] {}] и [] () [{}] будут соответствовать скобкам.
  • Поддержка вложенных символьных классов и операций с символьными классами, как в Техническом стандарте Unicode # 18, может быть добавлена в будущем. Это изменило бы синтаксис, поэтому на данный момент поднимается исключение FutureWarning в неоднозначных случаях. Эти случаи включают символьные классы, начинающиеся с литерала '[' или содержащие последовательности буквенных символов '--', '&&', '~~', и '||'. Чтобы избежать исключений, избегайте их или экранируйте обратной косой чертой.
'|'

Выражение A|B, где A и B могут быть произвольными регулярными выражениями, создает выражение, которое будет соответствовать либо A, либо B. Таким образом '|' может быть разделено произвольное число регулярных выражений. Это можно использовать и внутри групп. При сканировании строки, регулярные выражения разделенные символом '|' проверяют совпадения слева направо. Когда один из шаблонов полностью совпадает, эта ветвь принимается. Это означает, что если A совпало, то B не будет проверяться дальше, даже если это приведет к более длительному общему соответствию. Другими словами, оператор ' | ' никогда не бывает жадным.

Чтобы сопоставить литерал '|', используйте \| или заключите его в символьный класс, как [|].

'(...)'

Конструкция '(...)' соответствует любому регулярному выражению, заключенному в скобки и указывает начало и конец группы. Содержимое группы может быть получено после выполнения поиска совпадений, а так же в строке шаблона с ней может быть сопоставлена обратная ссылка вида \number, описанной ниже. Чтобы сопоставить литералы '(' или ')' используйте \( или \), или заключите их в символьный класс: [(], [)].

Расширения регулярных выражений:

Конструкция '(?...)' обозначает расширение регулярных выражений (в противном случае '?' после '(' не имеет смысла. Первый символ после ‘?’ определяет, в чем смысл и дальнейший синтаксис конструкции. Расширения обычно не создают новую группу, за исключением конструкции (?P<name>...) — единственное исключение из этого правила. Ниже приведены поддерживаемые в настоящее время расширения регулярных выражений.

'(?aiLmsux)'

Конструкция '(?aiLmsux)' обозначает один или несколько букв из набора 'a', 'i', 'L', 'm', 's', 'u', 'x'. Группа соответствует пустой строке. Буквы устанавливают соответствующие флаги:

  • re.A — сопоставление только в ASCII,
  • re.I — игнорирование регистра,
  • re.L — в зависимости от локали,
  • re.M — многострочный,
  • re.S — точка соответствует всем,
  • re.U — сопоставление в Юникоде
  • re.X — режим отладки.

Флаги описаны в разделе «Флаги регулярных выражений в Python». Конструкция полезна, если необходимо включить флаги как часть регулярного выражения вместо передачи аргумента флага в функцию re.compile(). Флаги должны использоваться первыми в строке шаблона регулярного выражения.

'(?:...)'

Конструкция '(?...)' обозначает группу без захвата. Соответствует любому регулярному выражению, заключенному в круглые скобки, но подстрока, сопоставленная такой группой не может быть получена после выполнения сопоставления, так же в шаблоне на нее не может быть поставлена обратная ссылка типа \number.

'(?aiLmsux-imsx:...)'

Конструкция '(?aiLmsux-imsx:...)' обозначает ноль или более букв из набора 'a', 'i', 'L', 'm', 's', 'u', 'x', необязательно с последующим '-', за которым следует одна или более букв из 'i', 'm', 's', 'x'. Буквы устанавливают или удаляют соответствующие флаги:

  • re.A — сопоставление только в ASCII,
  • re.I — игнорирование регистра,
  • re.L — в зависимости от локали,
  • re.M — многострочный,
  • re.S — точка соответствует всем,
  • re.U — сопоставление в Юникоде
  • re.X — режим отладки.

Флаги описаны в разделе «Флаги регулярных выражений в Python».

При использовании в качестве встроенных флагов 'a', 'L' и 'u' являются взаимоисключающими, поэтому они не могут быть объединены или следовать за '-'. Вместо этого, когда один из них появляется во встроенной группе, он переопределяет соответствующий режим во включающей группе. В шаблонах Unicode (?a:...) переключается на сопоставление только ASCII, и (?u:...) на сопоставление Unicode (по умолчанию). В байтовом шаблоне (?L:...) переключается на соответствие в зависимости от локали и (?a:...) переключается на соответствие только ASCII ( по умолчанию). Это переопределение действует только для узкой встроенной группы и исходный режим сопоставления восстанавливается вне группы.

'(?P<name>...)'

Конструкция '(?P<name>...)' называется именованной группой, работает аналогично обычной группе (...). Совпавшая подстрока захватывается этой группой и доступна для последующего извлечения через символическое имя группы name. В шаблоне регулярного выражения имена групп должны быть действительными идентификаторами Python и каждое имя группы должно быть определено только один раз. Именованная группа также является пронумерованной группой, как если бы она была простой группой.

'(?P=name)'

Конструкция '(?P=name)' обозначает обратную ссылку на именованную группу. Это соответствует любому совпавшему тексту, который был сопоставлен с более ранней группой с именем name.

'(?#...)'

Конструкция '(?#...)' обозначает комментарий. Содержимое скобок просто игнорируется.

'(?=...)'

Конструкция '(?=...)' называется опережающей позитивной проверкой, где ... регулярное выражение, которое определяет проверяемую позицию с права от основного выражения. Например выражение Isaac (?=Asimov) будет соответствовать 'Isaac ', только если за ним следует 'Asimov'.

'(?!...)'

Конструкция '(?!...)' называется опережающей негативной проверкой, где ... регулярное выражение, которое определяет проверяемую позицию с права от основного выражения. Например выражение Isaac (?!Asimov) будет соответствовать 'Isaac ', только если за ним не следует 'Asimov'.

'(?<=...)'

Конструкция '(?<=...)' называется позитивной ретроспективной проверкой, где ... регулярное выражение, которое определяет проверяемую позицию слева от основного выражения.

Выражение (?<=abc)def найдет совпадение в 'abcdef', так как позитивная ретроспективная проверка создаст резервную копию 3-х символов и проверит, соответствует ли содержащийся шаблон. Шаблон с такой проверкой должен соответствовать только строкам некоторой фиксированной длины! Это означает, что выражения проверок abc или a|b разрешены для таких проверок, но выражения a* или а{3,4} потерпят неудачу. Обратите внимание, что шаблоны, которые начинаются с позитивной ретроспективной проверки, не будут совпадать с позицией в начале искомой строки. Для этого используйте функцию re.search(), а не функцию re.match():

import re
m = re.search('(?<=abc)def', 'abcdef')
m.group(0)
# 'def'

Этот пример ищет слово после дефиса:

m = re.search(r'(?<=-)\w+', 'spam-egg')
m.group(0)
# 'egg'
'(?<!...)'

Конструкция '(?<!...)' называется негативной ретроспективной проверкой, где ... регулярное выражение, которое определяет проверяемую позицию слева от основного выражения. Подобно положительным проверкам, шаблон регулярного выражения должен соответствовать только строкам фиксированной длины. Шаблоны регулярных выражений, которые начинаются с негативной ретроспективной проверки могут совпадать в начале искомой строки.

'(?(id/name)yes-pattern|no-pattern)'

Выражение '(?(id/name)yes-pattern|no-pattern)' будет стараться соответствовать yes-pattern если группа с указанным идентификатором или именем существует, а no-pattern является не обязательным и может быть опущена. Например (<)?(\[email protected]\w+(?:\.\w+)+)(?(1)>|$) это плохой шаблон соответствия электронной почты, который будет совпадать как с '<[email protected]>' так и с '[email protected]', но не с '<[email protected]' ни '[email protected]>'.

Специальные последовательности:

Специальные последовательности состоят из '\' и символа из списка ниже. Если обычный символ не является цифрой ASCII или буквой ASCII, то результирующее регулярное выражение будет соответствовать второму символу. Например \$ соответствует символу '$'.

'\number'

Специальная последовательность '\number' соответствует содержимому группы с тем же номером. Группы нумеруются начиная с 1. Например выражение (.+ ) \1 соответствует 'the the' или '55 55', но не 'thethe', обратите внимание на пробел после группы. Эта специальная последовательность может быть использована только для сопоставления одной из первых 99 групп. Если первая цифра числа равна 0, или число имеет длину 3 восьмеричные цифры, то оно будет интерпретироваться как символ с восьмеричным значением числа. Внутри ‘[‘ и ‘]’ символьного класса все числовые эскейпы рассматриваются как символы.

'\A'

Специальная последовательность '\A' совпадает только с положением начала строки.

'\b'

Специальная последовательность '\b' соответствует пустой строке, но только в начале или конце слова. Слово определяется как последовательность буквенно-цифровых символов. Обратите внимание, что формально '\b' определяется как граница между '\w' и '\W' специальными последовательностями или наоборот, или между '\w' началом и концом строки. Это означает, что выражение r'\bfoo\b' покажет совпадение в строках 'foo', ' foo.', '(foo)', 'bar foo baz' но не 'foobar' или 'foo3'.

По умолчанию буквенно-цифровые символы Unicode используются в шаблонах Unicode, но это можно изменить с помощью флага re.ASCII. Границы слова определяются текущей локалью, если используется флаг LOCALE. Внутри символьного класса '\b' представляет символ backspace для совместимости со строковыми литералами Python.

'\B'

Специальная последовательность '\B' соответствует пустой строке, но только если она не находится в начале или конце слова. Это означает, что выражение r'py\B' покажет совпадение в строках 'python', 'py3', 'py2', но не 'py', 'py.', или 'py!'. Последовательность \B — это как раз противоположность \b, поэтому символы слов в шаблонах Unicode являются буквенно-цифровыми символами Unicode или подчеркиванием, хотя это может быть изменено с помощью флага ASCII. Границы слов определяются текущей локализацией, если используется флаг локали.

Специальная последовательность '\b' соответствует пустой строке, но только если она не находится в начале или конце слова. Это означает , что r’py\B’матчи ‘python’, ‘py3’, ‘py2’, но не ‘py’, ‘py.’или ‘py!’. \Bявляется противоположностью \b, поэтому символы слова в шаблонах Unicode представляют собой буквенно-цифровые символы Unicode или подчеркивание, хотя это можно изменить с помощью флага re.ASCII. Границы слова определяются текущей локалью, если используется флаг LOCALE.

'\d'

Для шаблонов строк Unicode: специальная последовательность '\d' соответствует любой десятичной цифре Unicode, то есть любому символу в категории символов Unicode [Nd]. Это включает в себя диапазон [0-9], а также много других цифровых символов. Если используется флаг re.ASCII, то эквивалентно символьному классу [0-9].

Для шаблонов байтовых строк: специальная последовательность '\d' соответствует любой десятичной цифре, эквивалентно символьному классу [0-9]. \t\n\r\f\v].

'\w'

Для шаблонов строк Unicode: специальная последовательность '\w' соответствует символам Unicode, что включает в себя большинство символов, которые могут быть частью слова на любом языке, а также цифры и подчеркивание. Если используется флаг re.ASCII, то '\w' становится эквивалентно символьному классу [a-zA-Z0-9_].

Для шаблонов байтовых строк: специальная последовательность '\w' соответствует символам, которые считаются буквенно-цифровыми символами ASCII, что эквивалентно символьному классу [a-zA-Z0-9_]. Если используется флаг re.LOCALE, то '\w' соответствует символам, которые являются буквенно-цифровыми в текущей локали + символ подчеркивания.

'\W'

Специальная последовательность '\W' соответствует любому символу, который не является символом слова. Это противоположность \w.a-zA-Z0-9_]. Если используется флаг re.LOCALE, то '\W' соответствует символам, которые НЕ являются буквенно-цифровыми символами в текущей локали + символ подчеркивания.

'\Z'

Специальная последовательность '\Z' совпадает только с положением конца строки.

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

\a      \b      \f      \n
\N      \r      \t      \u
\U      \v      \x      \\

Обратите внимание, что \b используется для представления границ слов и означает «возврат» только внутри классов символов.

Escape-последовательности '\u', '\U' и '\N' распознаются только в шаблонах строк Unicode. В шаблонах байтовых строк они являются ошибками. Неизвестные экранированные символы ASCII зарезервированы для будущего использования и рассматриваются как ошибки.

Регулярные выражения — PHP с нуля

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

Начнем с одной народной программистской мудрости:

Некоторые люди, сталкиваясь с проблемой, думают: «Ага, я умный, я решу её с помощью регулярных выражений». Теперь у них две проблемы.

Это довольно-таки объемный и сложный урок. Но, если ты дошел до сюда, то ты способен осилить и это. Просто почти теорию, не надо запоминать, а когда дойдешь до задачек, вернись и проясни непонятные моменты. Ну или открой мануал — там эта тема подробно разъясняется. Ссылка: http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php

Примеры шаблонов

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

Любое выражение начинается с символа-ограничителя (delimiter по англ.). В качестве него обычно используют символ /, но можно использовать и другие символы, не имеющие специального назначения в регулярках, например, ~, # или @. Альтернативные разделители используют, если в выражении может встречаться символ /. Затем идет сам шаблон строки, которую мы ищем, за ним второй ограничитель и в конце может идти одна или несколько букв-флагов. Они задают дополнительные опции при поиске текста. Вот примеры флагов:

  • i — говорит, что поиск должен вестись без учета регистра букв (по умолчанию регистр учитывается)
  • u — говорит, что выражение и текст, по которому идет поиск, исплоьзуют кодировку utf-8, а не только латинские буквы. Без него поиск русских (и любых других нелатинских) символов может работать некорректно, потому стоит ставить его всегда.

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

Ниже мы разберем значение каждого из этих символов (а также объясним почему буква «ё» вынесена отдельно в первом выражении), а пока попробуем применить наши регулярки к тексту и посмотреть, что выйдет. В php есть специальная функция preg_match($regexp, $text, $match), которая принимает на вход регулярку, текст и пустой массив. Она проверяет, есть ли в тексте подстрока, соответствующая данному шаблону и возвращает 0, если нет, или 1, если она есть. А в переданный массив в элемент с индексом 0 кладется первое найденное совпадение с регуляркой. Напишем простую программу, применяющую регулярные выражения к разным строкам:

КодРезультат
$regexp = "/к[а-яё]т/ui";

// строки, к которым мы будем по очереди применять регулярку
$lines = [
  'рыжий кот',
  'рыжий крот',
  'кит и кот'
];

foreach ($lines as $line) {
    echo "Строка: $line\n";

    // сюда будет помещено первое
    // совпадение с шаблоном
    $match = [];
    if (preg_match($regexp, $line, $match)) {
        echo "+ Найдено слово '{$match[0]}'\n";
    } else {
        echo "- Ничего не найдено\n";
    }
}
Строка: рыжий кот
+ Найдено слово 'кот'
Строка: рыжий крот
- Ничего не найдено
Строка: кит и кот
+ Найдено слово 'кит'

Познакомившись с примером, изучим регулярные выражения более подробно.a-c] значит «один любой символ, кроме a, b или c».

  • Круглые скобки группируют символы и выражения. Например в выражении abc+ знак «плюс» относится только к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если поставить скобки a(bc)+ то квантифиактор плюс относится уже к последовательности bc и выражение ищет слова abc, abcbc, abcbcbc
  • Примечание: в квадратных скобках можно указывать диапазоны символов, но помни, что русская буква ё идет отдельно от алфавита и чтобы написать «любая русская буква», надо писать [а-яё].

    Бекслеши

    Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил, что бекслеш везде пишут по-разному. Где-то пишут один бекслеш: \d, а здесь в примерах он повторен 2 раза: \\d. Почему?

    Язык регулярных выражений требует писать бекслеш один раз. Однако в строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое значение: мануал про строки. Ну например, если написать $x = "\$"; то PHP воспримет это как специальную комбинацию и вставит в строку только символ $ (и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы вставить в строку последовательность \$, мы должны удвоить бекслеш и записать код в виде $x = "\\$";.

    По этой причине в некоторых случаях (там, где последовательность символов имеет специальный смысл в PHP) мы обязаны удваивать бекслеш:

    • Чтобы написать в регулярке \$, мы пишем в коде "\\$"
    • Чтобы написать в регулярке \\, мы удваиваем каждый бекслеш и пишем "\\\\"
    • Чтобы написать в регулярке бекслеш и цифру (\1), бекслеш надо удвоить: "\\1"

    В остальных случаях один или два бекслеша дадут один и тот же результат: "\\d" и "\d" вставят в строку пару символов \d — в первом случае 2 бекслеша это последовательность для вставки бекслеша, во втором случае специальной последовательности нет и символы вставятся как есть. Проверить, какие символы вставятся в строку, и что увидит движок регулярных выражений, можно с помощью echo: echo "\$";. Да, сложно, а что поделать?

    Специальные конструкции в регулярках

    • \d ищет одну любую цифру, \D — один любой символ, кроме цифры
    • \w соответствует одной любой букве (любого алфавита), цифре или знаку подчеркивания _. \W соответствует любому символу, кроме буквы, цифры, знака подчеркивания.

    Также, есть удобное условие для указания на границу слова: \b. Эта конструкция обозначает, что с одной стороны от нее должен стоять символ, являющийся буквой/цифрой/знаком подчеркивания (\w), а с другой стороны — не являющийся. Ну, например, мы хотим найти в тексте слово «кот». Если мы напишем регулярку /кот/ui, то она найдет последовательность этих букв в любом месте — например, внутри слова «скотина». Это явно не то, что мы хотели. Если же мы добавим условие границы слова в регулярку: /\bкот\b/ui, то теперь искаться будет только отдельно стоящее слово «кот».

    Мануал

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

    Задачка

    Напиши программу, получающую на вход автомобильный номер, и проверяющую, правильно ли он введен. Автомобильный номер имеет вид «а123вг», то есть начинается с буквы, за которой идет 3 цифры, и еще 2 буквы. Никаких посторонних символов быть в нем не должно.

    Эту программу надо решить с помощью preg_match() и регулярного выражения. Протестировать его ты можешь например на сайте Regex101.

    Задачка на проверку телефонов

    Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — правильный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).

    Задачу надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет, что они определяются как надо (если нет — надо вывести, какой именно номер не распознается правильно).

    Вот список номеров:

    
    // Правильные: 
    $correctNumbers = [ 
      '84951234567',  '+74951234567', '8-495-1-234-567', 
      ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', 
      '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', 
      '8 ( 999 ) 1234567', '8 999 123 4567'
    ];
    
    // Неправильные: 
    $incorrectNumbers = [
      '02', '84951234567 позвать люсю', '849512345', '849512345678', 
      '8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
      '84951a234567', '8495123456a', 
      '+1 234 5678901', /* неверный код страны */
      '+8 234 5678901', /* либо 8 либо +7 */
      '7 234 5678901' /* нет + */
    ];
    

    Также, на regex101 https://regex101.com/r/qF7vT8/3 уже введены номера и можно простестировать свою регулярку. Помни что на этом сайте надо писать бекслеш один раз, например \s, а не \\s. Флаг m там стоит чтобы ^ и $ в регулярке обозначали «начало и конец любой строки», а не «начало и конец всего текста». Флаг g (его нет в PHP, он только на этом сайте) значит что надо искать все совпадения с регуляркой, а не только первое.

    Подсказка: не надо строить сложных выражений и предусматривать все возможные комбинации символов. Достаточно написать: сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов

    Повторим

    • preg_match находит первое совпадение с регулярными выражением и проверяет, соответствует ли текст или часть выражению
    • preg_match_all находит все фрагменты текста, соответствующие регулярке
    • preg_split разбивает текст на массив частей по регулярному выражению
    • preg_replace заменяет в тексте части, соответствующие регулярке, на данную строку

    Задачки (пока без картинок)

    • На вход скрипта дан введенный пользователем номер телефона в виде 8-911-404-44-11 или +7(812)6786767 (в начале 8 или +7, потом идут 10 цифр и, возможно, какие-то символы). То есть, как и в прошлой задаче, человек вводит номер как хочет. Надо проверить номер на правильность и привести любой номер к единому формату 89114044411 (то есть, заменить +7 на 8 и выкинуть весь мусор вроде пробелов, скобок и минусов, кроме цифр)
    • Автозамена. Напиши скрипт, заменяющий определенное слово на другое (например, слово «дурак» на «хороший человек» в фразе «ты дурак»). Скрипт должен не пропускать слово, если оно написано буквами в разном регистре (ДуРАк), с заменой русских букв на похожие английские (а -> a), или через пробелы («ты — д у р а к»)
    • Дан текст, содержащий в себе email’ы (адреса почты вроде [email protected] ). Напиши скрипт, выводящий все email, встречающиеся в этом тексте
    • «Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:
      • нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
      • «жи» или «ши» написано с буквой ы
      • в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
      • в тексте есть слова «а» или «но» без запятой перед ними.
      • (можешь добавить еще несколько правил, если хорошо знаешь русский язык)

      В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).

    • Если ты сделал задачу про Grammar Nazi, сделай скрипт, которы вместо сообщения об ошибках будет молча их исправлять.

    Опечаточники

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

    Например, государственные органы, которые хотят провести закупки, обязаны организовать публичные торги и разместить объявление о них на сайте госзакупок. Чтобы помешать всем желающим участвовать в тендере (и чтобы отдать заказ «своим людям» и получить потом от них в свой карман часть денег), они заменяют в описании заказа некоторые русские буквы на похожие на них латинские. Таким образом, не предупрежденные заранее организации не смогут найти объявление через поиск и принять участие в конкурсе.

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

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

    Для проверки работоспособности, попробуй применить программу к тексту из поля «Наименование заказа» на странице (осторожно, спойлер!) http://zakupki.gov.ru/pgz/public/action/orders/info/common_info/show?notificationId=5193640 или http://zakupki.gov.ru/pgz/public/action/orders/info/common_info/show?notificationId=5138013 ололо кто бы поверил!

    Дополнительная задача: добавь в программу автоматическое исправление найденных «опечаток».

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

    P.S. На сайте программистских комиксов xkcd есть комикс про регулярные выражения: перевод, оригинал (англ.).

    дальше: Повторим? →

    ——

    Куда вводить код? Что надо скачать? Читай первый урок.

    Есть вопросы? Задай гуглу или автору.

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

    Как связаться с автором? Я хочу переодеть его в платье школьницы и жениться на нем. Ящик codedokode (кот) gmail.com ждет ваших писем. А вконтактик и фейсбучек ждут ваших лайков. Но ответ на банальные вопросы лучше искать в Гугле или на stackoverflow.

    Я решил задачку!!! Молодец, делай следующий урок

    Ideone не работает!11 Ну так открой Гугл и найди сайты вроде https://repl.it/languages/php , http://phptester.net/ , http://sandbox.onlinephpfunctions.com/ , http://codepad.org/ или http://www.runphponline.com/ . Не ленись.

    Почему так много рекламы? Всю рекламу на сайте ставит юкоз (бесплатный хостинг же), а не я.

    На сайте установлена система Google Analytics (и еще несколько аналогичных систем от юкоза). Данные о твоем IP-адресе, посещаемых страницах, времени посещения отправляются в Google Corporation, США. Хочу знать, кто и зачем сюда заходит. Поверь, другие сайты делают точно так же. Все сайты пишут логи.

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

    JGsoft.NETJavaPerlPCREPCRE2PHPDelphiRJavaScriptVBScriptXRegExpPythonRubystd :: regexBoostTcl AREPOSIX BREPOSIX EREGNU BREGNU EREOracleXMLXPathJGsoft.NETJavaPerlPCREPCRE2PHPDelphiRJavaScriptVBScriptXRegExpPythonRubystd :: regexBoostTcl AREPOSIX BREPOSIX EREGNU BREGNU EREOracleXMLXPath

    Пример ECMA
    awk расширенный
    egrep
    awk ECMA
    awk расширенный
    egrep
    awk От От От От От С ДА С ДА С С

    Этот сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование в поддержку этого сайта, и вы получите неограниченного доступа к этому сайту без рекламы!

    Характеристика Синтаксис Описание JGsoft .NET Java Perl PCRE PCRE2 PHP Delphi R JavaScript VBScript XRegExp Python Рубин std :: регулярное выражение Повышение Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE Оракул XML XPath
    Буквенный символ Любой символ, кроме [\ ^ $.|? * + () Все символы, кроме перечисленных специальных символов, соответствуют одному экземпляру самих себя a соответствует ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА
    Буквальные фигурные скобки {и} {и} являются буквальными символами, если они не являются частью допустимого токена регулярного выражения, например квантификатора {3} {соответствует { ДА ДА нет ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА 1.$. |? * + () {} Обратная косая черта экранирует специальные символы, чтобы подавить их особое значение \ * соответствует * ДА ДА нет ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА 1,9 базовый
    grep
    5 ECMA 1.5 –1.73
    basic 1.38–1.73
    grep 1.38–1.73
    YES YES YES YES no YES YES no
    Escape последовательность \ Q… \ E Буквально соответствует символам между \ Q и \ E, подавляя значение специальных символов. \ Q + — * / \ E соответствует + — * / ДА нет ДА ДА ДА ДА ДА ДА ДА нет нет нет нет нет нет ECMA
    расширенный
    egrep
    awk
    нет нет нет нет нет нет нет нет
    Шестнадцатеричный escape \ xFF, где FF — 2 шестнадцатеричные цифры Соответствует символу в указанной позиции кодовой страницы \ xA9 соответствует © при использовании кодовой страницы Latin-1 ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ECMA расширенный
    ECMA
    egrep
    awk
    ДА строка строка строка строка нет нет нет
    Преобразование символа \ n, \ r и \ t Соответствует символу LF, символу CR и символу табуляции соответственно \ r \ n соответствует разрыву строки Windows CRLF ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ECMA
    awk
    ДА строка строка строка строка нет ДА ДА
    разрыв строки \ R Соответствует любому разрыву строки, включая CRLF как пару, только CR, только LF, подачу формы, вертикальную табуляцию и любой разрыв строки Unicode. V2 нет 8 5.10 7.0 ДА 5.2.2 ДА ДА нет нет нет нет 2.0 нет ECMA
    1.42–1.73
    нет нет нет нет нет нет нет нет
    разрыв строки \ R Соответствует управляющему символу следующей строки U + 0085 V2 н / д 8 5.10 7,0 ДА 5.2.2 ДА ДА нет нет нет нет 2,0 ​​ нет ECMA
    1,54–1,73
    нет нет нет нет нет нет нет нет
    разрыв строки \ R Разрывы строк CRLF неделимы \ R {2} и \ R \ R не могут соответствовать \ r \ n ДА н / д 9 нет 5.10 нет 7.0–8.12 нет ДА 5.2.2–5.3.18 нет XE – XE6 нет ДА нет нет нет нет ДА Н / Д ДА Н / Д Н / Д Н / Д Н / Д Н / Д Н / Д Н / Д Н / Д a
    разрыв строки Буквальный разрыв строки CRLF, LF или CR Соответствует CRLF как паре, только CR и только LF независимо от стиля разрыва строки, используемого в регулярном выражении ДА нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет ДА ДА
    Преобразование символа \ а Соответствует управляющему символу «предупреждение» или «звонок» (ASCII 0x07). ДА ДА ДА ДА ДА ДА ДА ДА ДА нет нет нет ДА ДА awk ECMA
    расширенный
    egrep
    awk
    ДА нет нет нет нет нет нет нет
    Преобразование символов \ б Соответствует управляющему символу «backspace» (ASCII 0x08) нет нет нет нет нет нет нет нет нет нет нет нет нет нет awk нет ДА нет нет нет нет нет нет нет
    Преобразование символа \ B Соответствует обратной косой черте \ B соответствует \ нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет ДА нет нет нет нет нет нет нет
    Преобразование символа \ e Соответствует управляющему символу «escape» (ASCII 0x1B) ДА ДА ДА ДА ДА ДА ДА ДА ДА нет нет нет нет ДА нет ECMA
    расширенный
    egrep
    awk
    ДА нет нет нет нет нет нет нет
    Преобразование символов \ f Соответствует управляющему символу «подачи страницы» (ASCII 0x0C) ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ECMA
    awk
    ДА нет нет нет нет нет нет нет
    Преобразование символов \ в Соответствует управляющему символу «вертикальной табуляции» (ASCII 0x0B), но не любым другим вертикальным пробелам. V1 только ДА 4–7 нет нет нет нет нет нет ДА ДА ДА ДА ДА ECMA
    awk
    ECMA 1.38–1.39
    расширенный 1.38–1.73
    egrep 1.38–1.73
    awk 1.38–1.73
    ДА нет нет нет нет нет нет нет
    Управляющий символ побег \ cA до \ cZ Соответствует символу ASCII от Control + A до Control + Z, что эквивалентно от \ x01 до \ x1A \ cM \ cJ соответствует разрыву строки Windows CRLF V1 только ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА нет ДА ECMA расширенный ECMA 9015
    egrep
    awk
    ДА нет нет нет нет нет нет нет
    Преобразование управляющего символа \ ca до \ cz Соответствует символу ASCII от Control + A до Control + Z, что эквивалентно от \ x01 до \ x1A \ cm \ cj соответствует разрыву строки Windows CRLF V1 только ДА нет ДА ДА ДА ДА ДА ДА ДА ДА ДА нет ДА ECMA ECMA
    расширенный
    egrep
    awk
    ДА нет нет нет нет нет нет нет
    NULL escape \ 0 Соответствует символу NULL нет ДА нет ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА ECMA ДА ДА нет нет нет нет нет нет нет
    Octal escape \ o {7777}, где 7777 — любое восьмеричное число Соответствует символу в указанной позиции на активной кодовой странице \ o {20254} соответствует € при использовании Unicode V2 нет нет 5.14 8,34 ДА 5.5.10 XE7 3.0.3 нет нет нет нет нет нет нет нет нет нет нет нет нет нет нет
    Octal escape \ 1 — \ 7 Соответствует символу в указанной позиции в таблице ASCII \ 7 соответствует символу «колокольчик» нет ECMA нет нет нет нет нет нет нет ДА ДА нет нет нет awk нет нет нет нет нет нет нет нет нет
    Octal escape \ 10 до \ 77 Соответствует символу в указанной позиции в таблице ASCII \ 77 совпадений? нет ДА нет ДА ДА ДА ДА ДА ДА ДА ДА нет нет ДА awk нет ДА нет нет нет нет нет нет нет
    Octal escape \ 100 до \ 177 Соответствует символу в указанной позиции в таблице ASCII \ 100 совпадений @ нет ДА нет ДА ДА ДА ДА ДА ДА ДА ДА нет ДА ДА awk нет ДА нет нет нет нет нет нет нет
    Octal escape \ 200 до \ 377 Соответствует символу в указанной позиции на активной кодовой странице \ 377 соответствует ÿ при использовании кодовой страницы Latin-1 2.0–4,8 нет ДА ДА ДА ДА ДА ДА ДА ДА нет ДА 1.8 только сбой awk нет ДА нет нет нет нет нет нет нет
    Octal escape \ 400 до \ 777 Соответствует символу в указанной позиции на активной кодовой странице \ 777 соответствует ǿ при использовании Unicode нет не ECMA
    1.0–1.1 сбой
    нет 5,14 6,7 ДА 5.2.0 ДА ДА нет нет нет 3.5 ошибка 1.8 только сбой awk нет 8,4–8,5 нет нет нет нет нет нет нет
    Octal escape \ 01 по \ 07 Соответствует символу в указанной позиции в таблице ASCII \ 07 соответствует символу «колокольчик» V1 только ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА нет ДА ДА awk ДА нет нет нет нет нет нет нет
    Octal escape \ 010 по \ 077 Соответствует символу в указанной позиции в таблице ASCII \ 077 совпадений? V1 только ДА ДА ДА ДА ДА ДА ДА ДА ДА ДА нет ДА ДА awk ДА нет нет нет нет нет нет нет
    Octal escape \ 0100 по \ 0177 Соответствует символу в указанной позиции в таблице ASCII \ 0100 соответствует @ V1 только нет ДА нет нет нет нет нет нет нет нет нет нет нет нет ДА нет нет нет нет нет нет нет нет
    Octal escape \ 0200 по \ 0377 Соответствует символу в указанной позиции на активной кодовой странице \ 0377 соответствует ÿ при использовании кодовой страницы Latin-1 V1 только нет ДА нет нет нет нет нет нет нет нет нет нет нет нет ДА нет нет нет нет нет нет нет нет
    Элемент Синтаксис Описание Пример JGsoft .NET Java Perl PCRE PCRE2 PHP Delphi R JavaScript VBScript XRegExp Python Рубин std :: регулярное выражение Повышение Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE Оракул XML XPath

    Основы — Учебник по регулярным выражениям

    Основы регулярных выражений!

    Начать с начала.

    Введение

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

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

    Самый простой пример

    Регулярное выражение — это описание набора символов.Самый простой шаблон, который мы можем описать, — это точная строка (или последовательность) символов. Так, например, я могу выполнить поиск символов th (Или, говоря более конкретно, я ищу символ t , за которым следует символ h )

    чт

    Нет теории эволюции. Только список животных, которым разрешает жить Чак Норрис.

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

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

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

    Регулярные выражения иногда могут быть немного трудными для понимания сначала, поэтому, если приведенный ниже материал кажется немного запутанным, не беспокойтесь слишком сильно. С практикой это станет понятнее. Если вы обнаружите, что застряли, возможно, стоит пересмотреть нашу часть на предыдущей странице в Learning Regular Expressions

    Точка — любой символ

    Точка (.) (или точка) — это то, что мы называем метасимволом . Метасимволы — это символы, которые имеют особое значение. Они помогают нам создавать более интересные шаблоны, чем просто последовательность определенных символов. Практически все, на что мы смотрим отсюда, будет метасимволами.

    Точка (.) Представляет любой символ. Итак, с регулярным выражением ниже мы ищем символ b , за которым следует любой символ, за которым следует символ g .

    г.н.

    Большой мешок битов был прослушан.

    Важно отметить, что расширение. соответствует только одному символу. Мы можем заставить его соответствовать более чем одному символу, используя множители, которые мы рассмотрим ниже. В качестве альтернативы вы также можете использовать несколько., Например:

    л..э

    Вы можете жить как король, но убедитесь, что это не ложь.

    В приведенном выше примере мы сопоставляем l , за которым следуют два символа, за которыми следует e .

    Диапазоны персонажей

    . позволяет нам соответствовать любому персонажу. Иногда мы хотели бы быть более конкретными. Здесь могут пригодиться диапазоны . Мы указываем диапазон символов, заключая их в квадратные скобки ([]).

    т [eo] d

    Когда сегодня закончится, у Теда будет утомительное время наводить порядок.

    В приведенном выше регулярном выражении мы ищем символ t , за которым следует символ e или o , за которым следует символ d .

    Нет ограничений на количество символов, которые вы можете разместить в квадратных скобках. Вы можете разместить один символ, например. [y] (что было бы немного глупо, но, тем не менее, законно), или у вас может быть много, например. [grf4s2 # lknx].

    Ярлык для знаков подряд

    Допустим, мы хотели найти цифру от 1 до 8. Мы могли бы использовать диапазон вроде [12345678] , но есть ярлык, который мы можем использовать, чтобы немного упростить задачу.

    [1-8]

    Распределение комнат: G4 G9 F2 h2 L0 K7 M9

    Вы можете комбинировать набор символов вместе с другими персонажами.

    [1-49]

    Распределение комнат: G4 G9 F2 h2 L0 K7 M9

    В приведенном выше регулярном выражении мы ищем цифры 1, 2, 3, 4 или 9.

    Мы также можем комбинировать несколько наборов. В регулярном выражении ниже мы ищем 1, 2, 3, 4, 5, a, b, c, d, e, f, x.

    [1-5a-fx]

    Случайный набор символов: y, w, a, r, f, 4, 9, 6, 3, p, x, t

    Использование наборов символов иногда может приводить к странному поведению. Например, вы можете использовать диапазон [a-f] и обнаружить, что он соответствует D . Это связано с таблицами символов, которые использует система. В большинстве систем есть таблица символов, в которой сначала идут все строчные буквы, а затем прописные. например. abcdef …. xyzABCD … Однако в некоторых системах строчные и прописные буквы чередуются.0-9]


    Правило 5. Ноль или один экземпляр

    Когда за персонажем следует ? в регулярном выражении это означает соответствие нулю или одному экземпляру символа. Итак, X? соответствует ‘X’, если он есть в строке, но в остальном ничего не соответствует.

    Регулярное выражение Соответствует
    a? Bc abc bc
    цвет цвет цвет
    компьютеров? компьютер компьютер
    А? A Ø

    Ø в приведенной выше таблице означает, что регулярное выражение A? соответствует пустой строке — строке, не содержащей символов.AB]? WX WXC WXY [0-9]? [0-9]? [1-9] 007 05 9

    ВОПРОС 14:

    Какая из следующих строк соответствует [BD] [ae] [ae]? D ?

    Напишите RE, который соответствует строкам Баад , Be? D , г. De? D , а также Да? Д (это строки, а не шаблоны, и вопросительный знак является частью строки).

    Simple RegEx Tutorial

    Simple RegEx Tutorial

    Simple RegEx Tutorial

    Регулярное выражение можно использовать в условиях фильтра содержимого.

    Регулярные выражения

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

    Далее следует несколько очень простых примеров использования регулярных выражений. Для полного описания посетите www.abc $ «

    строка, которая начинается и заканчивается на «abc» — фактически сравнение с точным соответствием.

    «уведомление»

    строка, содержащая текст «примечание».

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

    ‘*’, ‘+’ и ‘?’

    Кроме того, символы «*», «+» и «?» Обозначают, сколько раз может встречаться символ или последовательность символов.Они означают: «ноль или более», «один или более» и «ноль или один». Вот несколько примеров:

    «ab *»

    соответствует строке, в которой есть a, за которым следует ноль или более символов b («ac», «abc», «abbc» и т. Д.)

    «ab +»

    то же самое, но есть хотя бы один b («abc», «abbc» и т. Д., Но не «ac»)

    «ab?»

    может быть один b или нет («ac», «abc», но не «abbc»).

    «a? B + $»

    возможная буква «а», за которой следует одна или несколько «б» в конце строки:

    Соответствует любой строке, оканчивающейся на «ab», «abb», «abbb» и т. Д. Или «b», «bb» и т. Д., Но не на «aab», «aabb» и т. Д.

    Подтяжки {}

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

    «ab {2}»

    соответствует строке, содержащей a, за которой следуют ровно две буквы b («abb»)

    «ab {2,}»

    есть как минимум две буквы b (abb, abbbb и т. Д.))

    «ab {3,5}»

    от трех до пяти б («abbb», «abbbb» или «abbbbb»)

    Обратите внимание, что вы всегда должны указывать первое число диапазона (например, «{0,2}», а не «{, 2}»). Также, как вы могли заметить, символы «*», «+» и «?» имеют тот же эффект, что и использование границ «{0,}», «{1,}» и «{0,1}» соответственно.

    Теперь, чтобы определить последовательность символов, заключите их в круглые скобки:

    «a (bc) *»

    совпадает со строкой, за которой следует ноль или более копий последовательности «bc»

    .

    «a (bc) {1,5}»

    от одного до пяти экземпляров «bc.«

    ‘|’ Оператор ИЛИ

    Также есть «|» символ, который работает как оператор ИЛИ:

    «привет | привет»

    соответствует строке, в которой есть «привет» или «привет»

    «(b | cd) ef»

    строка, содержащая либо «bef», либо «cdef»

    «(a | b) * c»

    строка, в которой чередуются буквы a и b, оканчивающиеся на c

    (‘.’ в качестве первого символа в выражении в квадратных скобках (т.е.. [$ () | * +? {\ «с обратной косой чертой (‘\’), поскольку они имеют особое значение. Кроме того, вы должны экранировать сам символ обратной косой черты в строках PHP3, поэтому, например, обычный выражение «(\ $ | A) [0-9] +» будет иметь вызов функции: ereg («(\\ $ | A) [0-9] +», $ str) (какая строка это проверяет?)

    Только не забывайте, что выражения в квадратных скобках являются исключением из этого правила — внутри них все специальные символы, включая обратную косую черту (‘\’), теряют свои специальные полномочия (например, «[* \ +? {}.] «соответствует в точности любому из символов в скобках).’). Чтобы включить буквальный «-«, сделайте его первым или последним символом или второй конечной точкой диапазона. «

    .

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

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

    Theme: Overlay by Kaira Extra Text
    Cape Town, South Africa