Regular expression test page for java

Replacement Strings Tutorial

A replacement string, also known as the replacement text, is the text that each regular expression match is replaced with during a search-and-replace. In most applications, the replacement text supports special syntax that allows you to reuse the text matched by the regular expression or parts thereof in the replacement. This website also includes a complete replacement strings tutorial that explains this syntax. While replacement strings are fairly simple compared with regular expressions, there is still great variety between the syntax used by various applications and their actual behavior.

Matching a Specific Code Point

To match a specific Unicode code point, use \uFFFF where FFFF is the hexadecimal number of the code point you want to match. You must always specify 4 hexadecimal digits E.g. \u00E0 matches à, but only when encoded as a single code point U+00E0.

Perl, PCRE, Boost, and std::regex do not support the \uFFFF syntax. They use \x{FFFF} instead. You can omit leading zeros in the hexadecimal number between the curly braces. Since \x by itself is not a valid regex token, \x{1234} can never be confused to match \x 1234 times. It always matches the Unicode code point U+1234. \x{1234}{5678} will try to match code point U+1234 exactly 5678 times.

In Java, the regex token \uFFFF only matches the specified code point, even when you turned on canonical equivalence. However, the same syntax \uFFFF is also used to insert Unicode characters into literal strings in the Java source code. Pattern.compile("\u00E0") will match both the single-code-point and double-code-point encodings of à, while Pattern.compile("\\u00E0") matches only the single-code-point version. Remember that when writing a regex as a Java string literal, backslashes must be escaped. The former Java code compiles the regex à, while the latter compiles \u00E0. Depending on what you’re doing, the difference may be significant.

JavaScript, which does not offer any Unicode support through its RegExp class, does support \uFFFF for matching a single Unicode code point as part of its string syntax.

XML Schema and XPath do not have a regex token for matching Unicode code points. However, you can easily use XML entities like to insert literal code points into your regular expression.

Unicode Scripts

The Unicode standard places each assigned code point (character) into one script. A script is a group of code points used by a particular human writing system. Some scripts like Thai correspond with a single human language. Other scripts like Latin span multiple languages.

Some languages are composed of multiple scripts. There is no Japanese Unicode script. Instead, Unicode offers the Hiragana, Katakana, Han, and Latin scripts that Japanese documents are usually composed of.

A special script is the Common script. This script contains all sorts of characters that are common to a wide range of scripts. It includes all sorts of punctuation, whitespace and miscellaneous symbols.

All assigned Unicode code points (those matched by \P{Cn}) are part of exactly one Unicode script. All unassigned Unicode code points (those matched by \p{Cn}) are not part of any Unicode script at all.

The JGsoft engine, Perl, PCRE, PHP, Ruby 1.9, Delphi, and XRegExp can match Unicode scripts. Here’s a list:

  1. \p{Common}
  2. \p{Arabic}
  3. \p{Armenian}
  4. \p{Bengali}
  5. \p{Bopomofo}
  6. \p{Braille}
  7. \p{Buhid}
  8. \p{Canadian_Aboriginal}
  9. \p{Cherokee}
  10. \p{Cyrillic}
  11. \p{Devanagari}
  12. \p{Ethiopic}
  13. \p{Georgian}
  14. \p{Greek}
  15. \p{Gujarati}
  16. \p{Gurmukhi}
  17. \p{Han}
  18. \p{Hangul}
  19. \p{Hanunoo}
  20. \p{Hebrew}
  21. \p{Hiragana}
  22. \p{Inherited}
  23. \p{Kannada}
  24. \p{Katakana}
  25. \p{Khmer}
  26. \p{Lao}
  27. \p{Latin}
  28. \p{Limbu}
  29. \p{Malayalam}
  30. \p{Mongolian}
  31. \p{Myanmar}
  32. \p{Ogham}
  33. \p{Oriya}
  34. \p{Runic}
  35. \p{Sinhala}
  36. \p{Syriac}
  37. \p{Tagalog}
  38. \p{Tagbanwa}
  39. \p{TaiLe}
  40. \p{Tamil}
  41. \p{Telugu}
  42. \p{Thaana}
  43. \p{Thai}
  44. \p{Tibetan}
  45. \p{Yi}

Perl and the JGsoft flavor allow you to use \p{IsLatin} instead of \p{Latin}. The “Is” syntax is useful for distinguishing between scripts and blocks, as explained in the next section. PCRE, PHP, and XRegExp do not support the “Is” prefix.

Java 7 adds support for Unicode scripts. Unlike the other flavors, Java 7 requires the “Is” prefix.

Пример 4. Отслеживаем выполнение целевых действий на сайте

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

При этом посетители могут выбирать более одного языка в качестве желаемого к изучению. Руководство проекта поставило себе задачу узнать, как часто посетители выбирают более одного языка. Соответственно, необходимо настроить цель в Google Analytics. После отправки заявки отображается страница с одним из следующих URI.

/order?lang=eng

/order?lang=eng&esp

/order?lang=eng&esp&ita

/order?lang=eng&esp&ita&fra

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

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

/order\?lang=.{3}&

Используемые спец.символы:

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

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

Пример 5. Выбираем страницы с контентом на иностранном языке

На некотором сайте контент представлен сразу на нескольких языках — русском, английском, немецком и итальянском. Страницы на русском языке имеют стандартные URL-адреса, а в адресах страниц на других языках в конце через слэш добавляется обозначение языка контента:

www.site.ru/about

www.site.ru/about/en

www.site.ru/about/it

www.site.ru/about/de

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

www.site.ru/aboutencounter

www.site.ru/aboutdell

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

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

(/en|/it|/de)$

Используемые спец.символы:

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

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

Хороший инструмент для проверки созданных регулярных выражений поможет в их освоении. Можно использовать, например, этот: http://regexpal.com/.

Успехов!

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

Диалект регулярных выражений языка Python довольно-таки близок к диалекту текстового редактора Emacs. Тем не менее в Python синтаксис записи регулярных выражений можно динамически корректировать в любой момент времени. Если вы устали от огромного количества обратных слэшей (те, кто пользовался регулярными выражениями в Emacs, сразу поймёт, что я имею в виду), то можете от них избавиться:

re.set_syntax( RE_NO_BK_PARENS | RE_NO_BK_VBAR )

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

В Python механизм регулярных выражений подключается с помощью модуля re. Поскольку Python по своей сущности является объектно-ориентированным языком, то это в полной мере относится и к его диалекту регулярных выражений. При необходимости создаётся объект типа «регулярное выражение», который в дальнейшем вы можете применять к строкам для выполнения поиска или замены. Рассмотрим следующий фрагмент кода:

undsc_regex = re.compile( '\s+(_.+_)\s+' )
...
result_text = undsc_regex.sub( '\\1', input_text )

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

В данном случае применяется метод замены sub(), который принимает в качестве аргументов строку замены и обрабатываемый текст input_text

Обратите внимание на элемент \1, обозначающий найденный фрагмент и соответствующий той части шаблона, которая заключена в круглые скобки. В отличие от Perl, обозначение \1 включается и в строку замены

В результате обработки текст (сохраняемый в result_text) будет заключён в HTML-тэги «подчёркнутый текст», например: «здесь важно отметить». А вот как решается проблема с повторяющимися словами-опечатками («не не», «для для» и т.д.) на языке Python:

А вот как решается проблема с повторяющимися словами-опечатками («не не», «для для» и т.д.) на языке Python:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import re

# Потребуются три объекта типа "регулярное выражение"
RegEx1 = re.compile( '\b(\w+)((\s|]+>)+)(\\1\b)' )
RegEx2 = re.compile( '^(*\n)+' )
RegEx3 = re.compile( '^(.)' )

# Обработка всех файлов, имена которых заданы в командной строке
for filename in sys.argv:
  try:
    fd = sys.open( filename )
  except:
    raise 'Ошибка при попытке открыть файл'
    continue

  # Считать содержимое файла, обработать с помощью трёх подготовленных
  # регулярных выражений и вывести найденные совпадения
  txt_data = fd.read()
  txt_data = RegEx1.gsub( '\033[7m\\1\033[m\\2\033[7m\\4\033[m', txt_data )
  txt_data = RegEx2.gsub( '', txt_data )
  txt_data = RegEx3.gsub( filename + ': \\1', txt_data )
  print txt_data

В этой программе все обнаруженные повторения-опечатки выводятся на стандартное устройство с указанием имени файла, в котором они были найдены, и выделяются подсветкой при помощи esc-последовательностей (символ ESC \033).

/Быть или не быть/ugi ¶

Синтаксис регулярных выражений прост и логичен. Он разделяется на символ-разделитель (он идёт в начале и конце выражения, обычно это /), шаблон поиска и необязательные модификаторы.

Формальный синтаксис такой:

Разделителем может быть любой символ, но обычно это или

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

Давайте разберём выражение :

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

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.

Скобочные группы ― ()

a(bc)       создаём группу со значением bc -> тестa(?:bc)*    оперетор ?: отключает группу -> тестa(?bc) так, мы можем присвоить имя группе -> тест

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

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

Решение¶

Сопоставление с текстовыми образцами

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

Можно также выполнять сопоставление в командах и :

Выделение лексем в стилизованном тексте

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

(: Выделить из даты в формате ISO () год, месяц и день, представив их в виде последовательности 🙂

(: Выделить из даты в формате ISO () год, месяц, день, часы, минуты и секунды представив их в виде последовательности 🙂

(: Разбить предложение на слова 🙂

Замена и расширение текста

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

(: Заменить день месяца в дате в формате ISO на 01 🙂

(: Убрать из даты в формате ISO все компоненты, кроме года 🙂

При втором способе использования replace вы вставляете текст в место, где произошло сопоставление с образцом, не изменяя самого сопоставленного фрагмента. Возможно, тот факт, что функция, называемая replace (заменить), может выполнять вставку текста, и противоречит интуиции, но именно такого результата позволяют добиться обратные ссылки.

(: Вставить пробел после знаков препинания, за которыми не следует пробел 🙂

Анализ текста для преобразования в формат XML

Еще более мощной, чем функции и , является появившаяся в XSLT 2.0 команда . Она позволяет не просто выполнять подстановки в тексте, но строить на основе текста XML-содержимое.

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

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

sed '/^$/d' filename

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

sed '/^*$/d' filename

Здесь под обозначением TAB подразумевается «настоящий», литеральный символ табуляции (генерируемый при нажатии клавиши Tab на клавиатуре).

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

sed '  */ /g' filename

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

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

sed '/^$/!s/^/  /g' filename

Ещё несколько примеров

— Поиск записей с ссылками.

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

SELECT * FROM `posts` 
WHERE `content` RLIKE 'https?://(+.)+{2,7}'

— Замена всех абсолютных ссылок в БД при переезде сайта на другой домен

UPDATE `articles` SET 
`content`=REPLACE(`content`, 'old-domain.crimea.ua', 'new-domain.ru') 
WHERE `content` RLIKE 'old-domain.com'

— Редирект в .htaccess с HTML-версии сайта на PHP

RedirectMatch /(.*)\.html$ /$1.php

— Редирект со страницы /index.php на корневую «/» для избавления от дублей

RewriteCond %{THE_REQUEST} ^{3,9} /index.php HTTP/
RewriteRule ^index.php$ http://site.com.ua/ 

— Наличие UTM-метки в URL

(?:?|&)utm=(+)

— Добавление сегмента в Google Analytics для отслеживания органического трафика

(кликните для увеличения изображения)

— Исключение офисного трафика из статистики Google Analytics

— Блокировка доступа к сканированию сайта роботами Ahrefs и Open Site Explorer.

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^rogerbot 
RewriteCond %{HTTP_USER_AGENT} ^AhrefsBot
RewriteRule .* - 

Выше приведены достаточно не сложные, но часто используемые примеры, и здесь совсем не затронута Яндекс.Метрика, где также можно использовать регулярные выражения. Для тестирования своих конструкций и тренировок с RegExp можно использовать удобный сервис http://www.rubular.com, а здесь можно скачать и распечатать хорошую памятку по регулярным выражениям, если вы решили к ним подойти более серьезно.

Anchors

Anchors, or atomic zero-width assertions, cause a match to succeed or fail depending on the current position in the string, but they do not cause the engine to advance through the string or consume characters. The metacharacters listed in the following table are anchors. For more information, see Anchors.

Assertion Description Pattern Matches
By default, the match must start at the beginning of the string; in multiline mode, it must start at the beginning of the line. in
By default, the match must occur at the end of the string or before at the end of the string; in multiline mode, it must occur before the end of the line or before at the end of the line. in
The match must occur at the start of the string. in
The match must occur at the end of the string or before at the end of the string. in
The match must occur at the end of the string. in
The match must occur at the point where the previous match ended. , , in
The match must occur on a boundary between a (alphanumeric) and a (nonalphanumeric) character. , in
The match must not occur on a boundary. , in

Regular Expression Options

You can specify options that control how the regular expression engine interprets a regular expression pattern. 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. 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.

The .NET regular expression engine supports the following inline options:

Option Description Pattern Matches
Use case-insensitive matching. , in
Use multiline mode. 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.
Ignore unescaped white space in the regular expression pattern. , in

Подробнее о регулярных выражениях

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

  • Oracle Database Application Developer’s Guide — Fundamentals. В главе 4 этого руководства описана поддержка регулярных выражений в Oracle.
  • Oracle Regular Expression Pocket Reference Хороший вводный учебник по работе с регулярными выражениями; авторы — Джонатан Дженник ( Jonathan Gennick) и Питер Линсли (Peter Linsley). Питер является одним из разработчиков реализации регулярных выражений Oracle.
  • Mastering Oracle SQL. Одна из глав книги посвящена регулярным выражениям в контексте Oracle SQL. Отличный учебник для всех, кто хочет поднять свои навыки использования SQL на новый уровень.
  • Mastering Regular Expressions. Книга Джеффри Фридла ( Jeffrey Friedl) считается самым авторитетным источником информации об использовании регулярных выражений. Если вы хотите действительно глубоко изучить материал — читайте книгу Фридла.

Вас заинтересует / Intresting for you:

Работа с явными курсорами в PL…

3442 просмотров

Максим Николенко

Sun, 26 Aug 2018, 10:53:20

Работа с данными пакета (packa…

2534 просмотров

Игорь Воронов

Wed, 10 Oct 2018, 19:11:12

Управление транзакциями в PL/S…

3213 просмотров

sepia

Wed, 15 Aug 2018, 19:01:20

PL/SQL: отправка электронной п…

1864 просмотров

Akmal

Wed, 05 Dec 2018, 11:39:57

Author: Дэйзи ак-Макарова

Другие статьи автора:

«Петя любит Дашу».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…) Задаёт имя под-шаблона /(?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 Найдёт слово, в котором н встречается от трёх и более раз подряд

Альтернативы

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

Для демонстрации мы будем использовать grep в паре с echo. Для начала давайте попробуем проверить простое старое соответствие строки:

echo "AAA" | grep AAA
AAA
echo "BBB" | grep AAA

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

Сейчас мы добавим альтернативы, выраженные с помощью метасимвола вертикальная черта:

echo "AAA" | grep -E 'AAA|BBB'
AAA
echo "BBB" | grep -E 'AAA|BBB'
BBB
echo "CCC" | grep -E 'AAA|BBB'

Здесь мы видим регулярное выражение ‘AAA|BBB’, которое означает «соответствие или строке AAA или строке BBB»

Обратите внимание, что поскольку это расширенная функция, мы добавили к grep опцию -E (хотя вместо этого можно было использовать просто программу egrep, но это не рекомендуется – команда egrep теперь является устаревшей). Ещё мы заключили регулярное выражение в кавычки, для предотвращения интерпретации Башем вертикальной черты в качестве оператора pipe (труба)

Альтернативы не ограничены двумя вариантами выбора:

echo "AAA" | grep -E 'AAA|BBB|CCC'
AAA

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

grep -Eh '^(bz|gz|zip)' dirlist*.txt

Это выражение будет соответствовать именам файлов в нашем списке, которые начинаются либо с «bz», «gz» или «zip». Если мы уберём скобки из нашего регулярного выражения:

grep -Eh '^bz|gz|zip' dirlist*.txt

то его значение измениться, теперь оно будет соответствовать любому имени файла, начинающемуся с «bz» или содержащему «gz» или содержащему «zip».

Ссылка на основную публикацию