Регулярные выражения .net.net regular expressions

В теории формальных языков

Основная статья: Регулярный язык

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

  • (пустое множество) ∅.
  • (пустая строка) ε обозначает строку, не содержащую ни одного символа. Эквивалентно «».
  • (символьный литерал) «a», где «a» — символ алфавита Σ.
  • (множество) из символов, либо из других множеств.

и следующие операции:

  • (сцепление, конкатенация) RS обозначает множество {αβ | α ∈ R & β ∈ S}. Например, {«boy», «girl»}{«friend», «cott»} = {«boyfriend», «girlfriend», «boycott», «girlcott»}.
  • (дизъюнкция, чередование) R|S обозначает объединение R и S. Например, {«ab», «c»}|{«ab», «d», «ef»} = {«ab», «c», «d», «ef»}.
  • (замыкание Клини, звезда Клини) R* обозначает минимальное надмножество множества R, которое содержит ε и замкнуто относительно конкатенации. Это есть множество всех строк, полученных конкатенацией нуля или более строк из R. Например, {«Run», «Forrest»}* = {ε, «Run», «Forrest», «RunRun», «RunForrest», «ForrestRun», «ForrestForrest», «RunRunRun», «RunRunForrest», «RunForrestRun», …}.

«Петя любит Дашу».replace(/Дашу|Машу|Сашу/, «Катю») ¶

Не трудно догадаться, что результатом работы js-выражения выше будет текст . Даже, если Петя неровно дышит к Маше или Саше, то результат всё равно не изменится.

Рассмотрим базовые спец. символы, которые можно использовать в шаблонах:

Символ Описание Пример использования Результат
\ Символ экранирования или начала мета-символа /путь\/к\/папке/ Надёт текст
^ Признак начала строки /^Дом/ Найдёт все строки, которые начинаются на
$ Признак конца строки /родной$/ Найдёт все строки, которые заканчиваются на
. Точка означает любой символ, кроме перевода строки /Петя ..бит Машу/ Найдёт как , так и
| Означает ИЛИ /Вася|Петя/ Найдёт как Васю, так и Петю
? Означает НОЛЬ или ОДИН раз /Вжу?х/ Найдёт и
* Означает НОЛЬ или МНОГО раз /Вжу*х/ Найдёт , , , и т.д.
+ Означает ОДИН или МНОГО раз /Вжу+х/ Найдёт , , и т.д.

Помимо базовых спец. символов есть мета-символы (или мета-последовательности), которые заменяют группы символов:

Символ Описание Пример использования Результат
\w Буква, цифра или _ (подчёркивание) /^\w+$/ Соответствует целому слову без пробелов, например
\W НЕ буква, цифра или _ (подчёркивание) /\W\w+\W/ Найдёт полное слово, которое обрамлено любыми символами, например
\d Любая цифра /^\d+$/ Соответствует целому числу без знака, например
\D Любой символ НЕ цифра /^\D+$/ Соответствует любому выражению, где нет цифр, например
\s Пробел или табуляция (кроме перевода строки) /\s+/ Найдёт последовательность пробелов от одного и до бесконечности
\S Любой символ, кроме пробела или табуляции /\s+\S/ Найдёт последовательность пробелов, после которой есть хотя бы один другой символ
\b Граница слова /\bдом\b/ Найдёт только отдельные слова , но проигнорирует
\B НЕ граница слова /\Bдом\b/ Найдёт только окночние слов, которые заканчиваются на
\R Любой перевод строки (Unix, Mac, Windows) /.*\R/ Найдёт строки, которые заканчиваются переводом строки

Нужно отметить, что спец. символы \w, \W, \b и \B не работают по умолчанию с юникодом (включая кириллицу). Для их правильной работы нужно указывать модификатор . К сожалению, на окончание 2019 года JavaScript не поддерживает регулярные выражения для юникода даже с модификатором, поэтому в js эти мета-символы работают только для латиницы.

Ещё регулярные выражения поддерживают разные виды скобочек:

Выражение Описание Пример использования Результат
(…) Круглые скобки означают под-шаблон, который идёт в результат поиска /(Петя|Вася|Саша) любит Машу/ Найдёт всю строку и запишет воздыхателя Маши в результат поиска под номером 1
(?:…) Круглые скобки с вопросом и двоеточием означают под-шаблон, который НЕ идёт в результат поиска /(?:Петя|Вася|Саша) любит Машу/ Найдёт только полную строку, воздыхатель останется инкогнито
(?P<name>…) Задаёт имя под-шаблона /(?P<воздыхатель>Петя|Вася|Саша) любит Машу/ Найдёт полную строку, а воздыхателя запишет в результат под индексом 1 и ‘воздыхатель’
Квадратные скобки задают ЛЮБОЙ СИМВОЛ из последовательности (включая спец. символы \w, \d, \s и т.д.) /^+$/ Соответствует любому выражению , но не
Если внутри квадратных скобок указать минус, то это считается диапазоном /+/ Аналог /\w/ui для JavaScript
Если минус является первым или последним символом диапазона, то это просто минус /+/ Найдёт любое целое числое с плюсом или минусом (причём не обязательно, чтобы минус или плюс были спереди)
Квадратные скобки с «крышечекой» означают любой символ НЕ входящий в диапазон //i Найдёт любой символ, который не является буквой, числом или пробелом
] Квадратные скобки в квадратных скобках задают класс символов (alnum, alpha, ascii, digit, print, space, punct и другие) /]+/ Найдёт последовательность непечатаемых символов
{n} Фигурные скобки с одним числом задают точное количество символов /\w+н{2}\w+/u Найдёт слово, в котором две буквы н
{n,k} Фигурные скобки с двумя числами задают количество символов от n до k /\w+н{1,2}\w+/u Найдёт слово, в котором есть одна или две буквы н
{n,} Фигурные скобки с одним числом и запятой задают количество символов от n до бесконечности /\w+н{3,}\w+/u Найдёт слово, в котором н встречается от трёх и более раз подряд

Возможности

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

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

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

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

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

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

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

PHP’s Regexp POSIX Functions

PHP currently offers seven functions for searching strings using POSIX-style regular expressions −

Sr.No Function & Description
1 ereg()

The ereg() function searches a string specified by string for a string specified by pattern, returning true if the pattern is found, and false otherwise.

2 ereg_replace()

The ereg_replace() function searches for string specified by pattern and replaces pattern with replacement if found.

3 eregi()

The eregi() function searches throughout a string specified by pattern for a string specified by string. The search is not case sensitive.

4 eregi_replace()

The eregi_replace() function operates exactly like ereg_replace(), except that the search for pattern in string is not case sensitive.

5 split()

The split() function will divide a string into various elements, the boundaries of each element based on the occurrence of pattern in string.

6 spliti()

The spliti() function operates exactly in the same manner as its sibling split(), except that it is not case sensitive.

7 sql_regcase()

The sql_regcase() function can be thought of as a utility function, converting each character in the input parameter string into a bracketed expression containing two characters.

Строковые методы, поиск и замена

Следующие методы работают с регулярными выражениями из строк.

Все методы, кроме replace, можно вызывать как с объектами типа regexp в аргументах, так и со строками, которые автоматом преобразуются в объекты RegExp.

Так что вызовы эквивалентны:

var i = str.search(/\s/)
var i = str.search("\\s")

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

var regText = "\\s"
var i = str.search(new RegExp(regText, "g"))

Возвращает индекс регулярного выражения в строке, или -1.

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

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

function testinput(re, str){
   if (str.search(re) != -1)
      midstring = " contains ";
   else
      midstring = " does not contain ";
   document.write (str + midstring + re.source);
}

Если в regexp нет флага , то возвращает тот же результат, что .

Если в regexp есть флаг , то возвращает массив со всеми совпадениями.

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

Если Вы хотите получить первый результат — попробуйте r.

В следующем примере используется, чтобы найти «Chapter», за которой следует 1 или более цифр, а затем цифры, разделенные точкой. В регулярном выражении есть флаг , так что регистр будет игнорироваться.

str = "For more information, see Chapter 3.4.5.1";
re = /chapter (\d+(\.\d)*)/i;
found = str.match(re);
alert(found);

Скрипт выдаст массив из совпадений:

  • Chapter 3.4.5.1 — полностью совпавшая строка
  • 3.4.5.1 — первая скобка
  • .1 — внутренняя скобка

Следующий пример демонстрирует использование флагов глобального и регистронезависимого поиска с . Будут найдены все буквы от А до Е и от а до е, каждая — в отдельном элементе массива.

var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = //gi;
var matches = str.match(regexp);
document.write(matches);

// matches = 

Метод replace может заменять вхождения регулярного выражения не только на строку, но и на результат выполнения функции. Его полный синтаксис — такой:

var newString = str.replace(regexp/substr, newSubStr/function)
Объект RegExp. Его вхождения будут заменены на значение, которое вернет параметр номер 2
Строка, которая будет заменена на .
Строка, которая заменяет подстроку из аргумента номер 1.
Функция, которая может быть вызвана для генерации новой подстроки (чтобы подставить ее вместо подстроки, полученной из аргумента 1).

Метод не меняет строку, на которой вызван, а просто возвращает новую, измененную строку.

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

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

var ab = "a b".replace("\\s","..") // = "a b"

Вызов replace оставил строку без изменения, т.к искал не регулярное выражение , а строку «\s».

В строке замены могут быть такие спецсимволы:

Pattern Inserts
Вставляет «$».
Вставляет найденную подстроку.
Вставляет часть строки, которая предшествует найденному вхождению.
Вставляет часть строки, которая идет после найденного вхождения.
or Где или — десятичные цифры, вставляет подстроку вхождения, запомненную -й вложенной скобкой, если первый аргумент — объект RegExp.

Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении.

В функции можно динамически генерировать и возвращать строку подстановки.

Первый параметр функции — найденная подстрока. Если первым аргументом является объект , то следующие параметров содержат совпадения из вложенных скобок. Последние два параметра — позиция в строке, на которой произошло совпадение и сама строка.

Например, следующий вызов возвратит XXzzzz — XX , zzzz.

function replacer(str, p1, p2, offset, s)
{
return str + " - " + p1 + " , " + p2;
}
var newString = "XXzzzz".replace(/(X*)(z*)/, replacer)

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

Следующая функция заменяет слова типа на :

function styleHyphenFormat(propertyName)
{
  function upperToHyphenLower(match)
  {
    return '-' + match.toLowerCase();
  }
  return propertyName.replace(//, upperToHyphenLower);
}

str.replace(str|regexp, str|func)

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

Мы можем использовать его и без регулярных выражений, для поиска-и-замены подстроки:

Хотя есть подводный камень.

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

Вы можете видеть это в приведённом выше примере: только первый заменяется на .

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

Второй аргумент – строка замены. Мы можем использовать специальные символы в нем:

Спецсимволы Действие в строке замены
вставляет
вставляет всё найденное совпадение
вставляет часть строки до совпадения
вставляет часть строки после совпадения
если это 1-2 значное число, то вставляет содержимое n-й скобки
вставляет содержимое скобки с указанным именем

Например:

Для ситуаций, которые требуют «умных» замен, вторым аргументом может быть функция.

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

Функция вызывается с аргументами :

  1. – найденное совпадение,
  2. – содержимое скобок (см. главу Скобочные группы).
  3. – позиция, на которой найдено совпадение,
  4. – исходная строка,
  5. – объект с содержимым именованных скобок (см. главу Скобочные группы).

Если скобок в регулярном выражении нет, то будет только 3 аргумента: .

Например, переведём выбранные совпадения в верхний регистр:

Заменим каждое совпадение на его позицию в строке:

В примере ниже две скобки, поэтому функция замены вызывается с 5-ю аргументами: первый – всё совпадение, затем два аргумента содержимое скобок, затем (в примере не используются) индекс совпадения и исходная строка:

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

Или, если мы используем именованные группы, то объект с ними всегда идёт последним, так что можно получить его так:

Использование функции даёт нам максимальные возможности по замене, потому что функция получает всю информацию о совпадении, имеет доступ к внешним переменным и может делать всё что угодно.

Алгоритм[править]

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

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

Например, для , очевидно, проще написать простой сопоставитель, чем строить НКА.

Псевдокодправить

function match(regexp: String, text: String): boolean  
    if regexp == '^'
        return matchHere(regexp, text)  
    int i = 0
    while i  text.length
        if matchHere(regexp, text)
            return true
        i++
    return false

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

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

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

function matchHere(regexp: String, text: String): boolean 
    if regexp == '\0'
        return true 
    if regexp == '*'  
        return matchStar(regexp, regexp, text)
    if regexp == '$' and regexp == '\0'
        return text == '\0'
    if text != '\0' and (regexp == '.' or regexp == text)
        return matchHere(regexp, text)
    return false

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

function matchStar(c: char, regexp: String, text: String): boolean
    int i = 0
    while i  text.length and (text == c or c == '.')
        if matchHere(regexp, text)
            return true
        i++
    return false

Рассмотрим возможные случаи:

  1. Если в ходе рекурсии регулярное выражение осталось пустым то текст допускается этим регулярным выражением.
  2. Если регулярное выражение имеет вид , то вызывается функция которая пытается сопоставить повторение символа , начиная с нуля повторений и увеличивая их количество, пока не найдет совпадение с оставшимся текстом. Если совпадение не будет найдено, то регулярное выражение не допускает текст. Текущая реализация ищет «кратчайшее совпадение», которое хорошо подходит для сопоставления с образцом, как в grep, где нужно как можно быстрее найти совпадение. «Наидлиннейшее совпадение» более интуитивно и больше подходит для текстовых редакторов, где найденное заменят на что-то. Большинство современных библиотек для работы с регулярными выражениями предоставляют оба варианта.
  3. Если регулярное выражение это , то оно допускает этот текст тогда и только тогда, когда текст закончился.
  4. Если первый символ текста совпал с первым символом регулярного выражения, то нужно проверить совпадают ли следующий символ регулярного выражения со следующим символом текста, сделав рекурсивный вызов .
  5. Если все предыдущие попытки найти совпадения провалились, то никакая подстрока из текста не допускается регулярным выражением.

Модификацииправить

Немного изменим функцию для поиск самого левого и самого длинного вхождения :

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

Псевдокодправить

function matchStar(c: char, regexp: String, text: String): boolean
    int i
    for (i = 0; text != '\0' and (text == c or c == '.'); i++)
    while i  0
        if matchHere(regexp, text)
            return true
        i--
    return false

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

SEO-специалисты прибегают к регулярным выражениям при работе с Google Analytics, Яндекс.Метрикой, RewriteRule в .htaccess, в текстовых редакторах, при работе с краулерами (Netpeak Spider).

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

1. Выделить всё, кроме домена:

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

2. Выделить URL заданной вложенности:

Здесь конструкция (/.*?/) обозначает один уровень вложенности.

Использую это выражение, когда нужно задать максимально разрешенную вложенность URL при сканировании сайта в Netpeak Spider.

Чтобы просканировать все URL адреса только первого уровня вложенности, в сервисе нужно задать такие настройки:

Литература

  • Фридл, Дж. Регулярные выражения = Mastering Regular Expressions. — СПб.: «Питер», 2001. — 352 с. — (Библиотека программиста). — ISBN 5-318-00056-8.
  • Смит, Билл. Методы и алгоритмы вычислений на строках (regexp) = Computing Patterns in Strings. — М.: «Вильямс», 2006. — 496 с. — ISBN 0-201-39839-7.
  • Форта, Бен. Освой самостоятельно регулярные выражения. 10 минут на урок = Sams Teach Yourself Regular Expressions in 10 Minutes. — М.: «Вильямс», 2005. — 184 с. — ISBN 5-8459-0713-6.
  • Ян Гойвертс, Стивен Левитан. Регулярные выражения. Сборник рецептов = Regular Expressions: Cookbook. — СПб.: «Символ-Плюс», 2010. — 608 с. — ISBN 978-5-93286-181-3.
  • Мельников С. В. Perl для профессиональных программистов. Регулярные выражения. — М.: «Бином», 2007. — 190 с. — (Основы информационных технологий). — ISBN 978-5-94774-797-3.

Классы символовCharacter Classes

Класс символов соответствует какому-либо одному набору символов.A character class matches any one of a set of characters. Классы символов состоят из языковых элементов, приведенных в следующей таблице.Character classes include the language elements listed in the following table. Дополнительные сведения см. в разделе Классы символов.For more information, see Character Classes.

Класс знаковCharacter class ОписаниеDescription ШаблонPattern Число соответствийMatches
character_group character_group Соответствует любому одиночному символу, входящему в character_group.Matches any single character in character_group. По умолчанию при сопоставлении учитывается регистр.By default, the match is case-sensitive. в in , в , in
character_group character_group Отрицание: соответствует любому одиночному символу, не входящему в character_group.Negation: Matches any single character that is not in character_group. По умолчанию символы в character_group чувствительны к регистру.By default, characters in character_group are case-sensitive. , , в , , in
first last first last Диапазон символов: соответствует одному символу в диапазоне от первого до последнего.Character range: Matches any single character in the range from first to last. , в , in
Подстановочный знак: соответствует любому одиночному символу, кроме \n.Wildcard: Matches any single character except \n.Для сопоставления символа точки (.To match a literal period character (. или ) перед ней нужно поставить дополнительную обратную косую черту ().or ), you must precede it with the escape character (). в in в in
имя name Соответствует любому одиночному символу в общей категории Юникода или в именованном блоке, указанном в параметре имя.Matches any single character in the Unicode general category or named block specified by name. , в , in , в , in
имя name Соответствует любому одиночному символу, не входящему в общую категорию Юникода или в именованный блок, указанный в параметре имя.Matches any single character that is not in the Unicode general category or named block specified by name. , , в , , in , в , in
Соответствует любому алфавитно-цифровому знаку.Matches any word character. , , , , в , , , , in
Соответствует любому символу, который не является буквенно-цифровым знаком.Matches any non-word character. , в , in
Соответствует любому знаку пробела.Matches any white-space character. в in
Соответствует любому знаку, не являющемуся пробелом.Matches any non-white-space character. в in
Соответствует любой десятичной цифре.Matches any decimal digit. в in
Соответствует любому символу, не являющемуся десятичной цифрой.Matches any character other than a decimal digit. , , , , в , , , , in

МетаСимволы

Для указания регулярных выражений используются метасимволы. В приведенном выше примере ( ) является метасимволом.

Метасимволы — это символы, которые интерпретируются особым образом механизмом RegEx. Вот список метасимволов:

[]. ^ $ * +? {} () \ |

— Квадратные скобки

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

Выражение Строка Совпадения
1 совпадение
2 совпадения
Не совпадает
5 совпадений

Здесь будет соответствовать, если строка, которую вы пытаетесь сопоставить, содержит любой из символов , или .

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

то же самое, что и .

то же самое, что и .

то же самое, что и .

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

означает любой символ, кроме или или .

означает любой нецифровой символ.

— Точка

Точка соответствует любому одиночному символу (кроме новой строки ).

Выражение Строка Совпадения
Не совпадает
1 совпадение
1 совпадение
2 совпадения (содержит 4 символа)

— Каретка

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

Выражение Строка Совпадения
1 совпадение
1 совпадение
Не совпадает
1 совпадение
Нет совпадений (начинается с , но не сопровождается )

— доллар

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

Выражение Строка Совпадения
1 совпадение
1 совпадение
Не совпадает

— Звездочка

Символ звездочки соответствует предыдущему символу повторенному 0 или более раз. Эквивалентно {0,}.

Выражение Строка Совпадения
1 совпадение
1 совпадение
1 совпадение
Нет совпадений ( не следует )
1 совпадение

— Плюс

Символ плюс соответствует предыдущему символу повторенному 1 или более раз. Эквивалентно {1,}.

Выражение Строка Совпадения
Нет совпадений (нет символа)
1 совпадение
1 совпадение
Нет совпадений ( не следует )
1 совпадение

— Вопросительный знак

Знак вопроса соответствует нулю или одному вхождению предыдущего символа. То же самое, что и {0,1}. По сути, делает символ необязательным.

Выражение Строка Совпадения
1 совпадение (0 вхождений а)
1 совпадение
Нет совпадений (более одного символа)
Нет совпадений ( не следует )
1 совпадение

— Фигурные скобки

Рассмотрим следующий код: . Это означает, по крайней мере , и не больше повторений предыдущего символа. При m=n=1 пропускается..

Выражение Строка Совпадения
Не совпадает
1 совпадение (в )
2 совпадения (при и )
2 совпадения (при и )

Посмотрим еще один пример. Это RegEx соответствует как минимум 2 цифрам, но не более 4-х цифр.

Выражение Строка Совпадения
1 совпадение (совпадение в )
3 совпадения ( , , )
Не совпадает

— Альтернация (или)

Альтернация (вертикальная черта) – термин в регулярных выражениях, которому в русском языке соответствует слово «ИЛИ». (оператор ).

Например: gr(a|e)y означает точно то же, что и gry.

Выражение Строка Совпадения
Не совпадает
1 совпадение (совпадение в )
3 совпадения (в )

Здесь сопоставьте любую строку, содержащую либо, либо

Чтобы примеСтрока альтернацию только к части шаблона, можно заключить её в скобки:

  • найдёт или .
  • найдёт или .

— Скобочные группы

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

Выражение Строка Совпадения
Не совпадает
1 совпадение (совпадение в )
2 совпадения (в )

— обратная косая черта

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

соответствует, если строка содержит , за которым следует . Здесь механизм RegEx не интерпретирует особым образом.

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

Параметры регулярных выраженийRegular Expression Options

Можно определить параметры, управляющие интерпретацией шаблона регулярного выражения обработчиком регулярных выражений.You can specify options that control how the regular expression engine interprets a regular expression pattern. Многие из этих параметров можно указать в шаблоне регулярного выражения либо в виде одной или нескольких констант RegexOptions.Many of these options can be specified either inline (in the regular expression pattern) or as one or more RegexOptions constants. Этот краткий справочник перечисляет только встраиваемые параметры.This quick reference lists only inline options. Дополнительные сведения о встроенных параметрах и параметрах RegexOptions см. в статье Параметры регулярных выражений.For more information about inline and RegexOptions options, see the article Regular Expression Options.

Встроенный параметр можно задать двумя способами:You can specify an inline option in two ways:

  • С помощью прочих конструкций , где минус (-) перед параметром или набором параметров отключает эти параметры.By using the miscellaneous construct , where a minus sign (-) before an option or set of options turns those options off. Например, включает сопоставление без учета регистра (), отключает многострочный режим () и отключает захват неименованных групп ().For example, turns case-insensitive matching () on, turns multiline mode () off, and turns unnamed group captures () off. Параметр применяется к шаблону регулярного выражения от точки, в которой определен параметр, и действует либо до конца шаблона, либо до точки, в которой другая конструкция отменяет параметр.The option applies to the regular expression pattern from the point at which the option is defined, and is effective either to the end of the pattern or to the point where another construct reverses the option.
  • С помощью конструкции группированиячасть выражения, которая определяет параметры для только для указанной группы.By using the grouping constructsubexpression, which defines options for the specified group only.

Механизм регулярных выражений .NET поддерживает следующие встроенные параметры:The .NET regular expression engine supports the following inline options:

ПараметрOption ОписаниеDescription ШаблонPattern Число соответствийMatches
Использовать соответствие без учета регистра.Use case-insensitive matching. , в , in
Использовать многострочный режим.Use multiline mode. и соответствуют началу и концу строки (line), а не началу и концу строки (string). and match the beginning and end of a line, instead of the beginning and end of a string. Пример см. в подразделе «Многострочный режим» раздела Параметры регулярных выражений.For an example, see the «Multiline Mode» section in Regular Expression Options.
Не захватывать неименованные группы.Do not capture unnamed groups. Пример см. в подразделе «Только явные захваты» раздела Параметры регулярных выражений.For an example, see the «Explicit Captures Only» section in Regular Expression Options.
Использовать однострочный режим.Use single-line mode. Пример см. в подразделе «Однострочный режим» раздела Параметры регулярных выражений.For an example, see the «Single-line Mode» section in Regular Expression Options.
Игнорировать знаки пробела в шаблоне регулярного выражения, не преобразованные в escape-последовательность.Ignore unescaped white space in the regular expression pattern. , в , in

Нечёткие регулярные выражения

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

  • Невский
  • Невск. просп.
  • Нев. проспект
  • наб. Канала Грибоедова («Канал Грибоедова» — это название второго выхода ст. м. Невский проспект)

Здесь обычные регулярные выражения неприменимы, в первую очередь из-за того, что входящие в образцы слова могут совпадать не очень точно (нечётко), но, тем не менее, было бы удобно описывать регулярными выражениями структурные зависимости между элементами образца,
например, в нашем случае, указать, что совпадение может быть с образцом «Невский проспект» ИЛИ «Канал Грибоедова», притом «проспект» может быть сокращено до «пр» или отсутствовать, а перед «Канал» может находиться сокращение «наб.»

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

Существует небольшое количество библиотек, реализующих механизм регулярных выражений с возможностью нечёткого сравнения:

  • TRE — бесплатная библиотека на С, использующая синтаксис регулярных выражений, похожий на POSIX (стабильный проект);
  • FREJ — open-source библиотека на Java, использующая Lisp-образный синтаксис и лишённая многих возможностей обычных регулярных выражений, но сосредоточенная на различного рода автоматических заменах фрагментов текста (бета-версия).

ПодстановкиSubstitutions

Подстановки — это языковые элементы регулярных выражений, которые поддерживаются в шаблонах замены.Substitutions are regular expression language elements that are supported in replacement patterns. Для получения дополнительной информации см. Подстановки.For more information, see Substitutions. Приведенные в следующей таблице метасимволы являются атомарными утверждениями нулевой ширины.The metacharacters listed in the following table are atomic zero-width assertions.

ЗнакCharacter ОписаниеDescription ШаблонPattern Шаблон заменыReplacement pattern Входная строкаInput string Результирующая строкаResult string
число number Замещает часть строки, соответствующую группе число.Substitutes the substring matched by group number.
имя name Замещает часть строки, соответствующую именованной группе имя.Substitutes the substring matched by the named group name.
Подставляет литерал «$».Substitutes a literal «$».
Замещает копией полного соответствия.Substitutes a copy of the whole match.
Замещает весь текст входной строки до соответствия.Substitutes all the text of the input string before the match.
Замещает весь текст входной строки после соответствия.Substitutes all the text of the input string after the match.
Замещает последнюю захваченную группу.Substitutes the last group that was captured.
Замещает всю входную строку.Substitutes the entire input string.
Добавить комментарий

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

Adblock
detector