Для того, чтобы полностью реализовать потенциал командной оболочки, вам придется овладеть Регулярными Выражениями. Многие команды и утилиты, обычно используемые в сценариях, такие как grep, expr, sed и awk, используют Регулярные Выражения.
18.1. Краткое введение в регулярные выражения
Выражение «13.» будет означать 13 + по меньшей мере один любой символ (включая пробел): 1133, 11333, но не 13 (отсутствуют дополнительные символы).
Выражение «^$» соответствует пустой строке.
Выражение «[c-n]» соответствует одному из символов в диапазоне от c до n, включительно.
Выражение «[B-Pk-y]» соответствует одному из символов в диапазоне от B до P или в диапазоне от k до y, включительно.
Выражение «[a-z0-9]» соответствует одному из символов латиницы в нижнем регистре или цифре.
Выражение «[^b-d]» соответствует любому символу, кроме символов из диапазона от b до d, включительно. В данном случае, метасимвол ^ означает отрицание.
Объединяя квадратные скобки в одну последовательность, можно задать шаблон искомого слова. Так, выражение «[Yy][Ee][Ss]» соответствует словам yes, Yes, YES, yEs и так далее. Выражение «655-35-6581» определяет шаблон для поиска любого номера карточки социального страхования (для США).
Угловые скобки должны экранироваться, иначе они будут интерпретироваться как простые символы.
Дополнительные метасимволы. Использующиеся при работе с egrep, awk и Perl
Язык программирования Perl и некоторые версии egrep не требуют экранирования фигурных скобок.
Некоторые версии sed, ed и ex поддерживают экранированные версии регулярных выражений, описанных выше.
Классы символов POSIX.[:class:]
Это альтернативный способ указания диапазона символов.
Вообще, символьные классы POSIX требуют заключения в кавычки или двойные квадратные скобки ([[ ]]).
Эти символьные классы могут использоваться, с некоторыми ограничениями, даже в операциях подстановки имен файлов (globbing).
Примеры использования символьных классов в сценариях вы найдете в Пример 12-14 и Пример 12-15.
Sed, awk и Perl, используемые в сценариях в качестве фильтров, могут принимать регулярные выражения в качестве входных аргументов. См. Пример A-13 и Пример A-19.
Книга «Sed & Awk» (авторы Dougherty и Robbins) дает полное и ясное представление о регулярных выражениях (см. раздел Литература).
Примечания
В качестве простейшего регулярного выражения можно привести строку, не содержащую никаких метасимволов.
Поскольку с помощью sed, awk и grep обрабатывают одиночные строки, то обычно символ перевода строки не принимается во внимание. В тех же случаях, когда производится разбор многострочного текста, метасимвол «точка» будет соответствовать символу перевода строки.
Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.
Спецсимволы
Аналог
Описание
()
подмаска, вложенное выражение
[]
групповой символ
количество вхождений от «a» до «b»
|
логическое «или», в случае с односимвольными альтернативами используйте []
\
экранирование спец символа
.
любой сивол, кроме перевода строки
\d
8
десятичная цифра
\D
[^\d]
любой символ, кроме десятичной цифры
\f
конец (разрыв) страницы
\n
перевод строки
\pL
буква в кодировке UTF-8 при использовании модификатора u
\r
возврат каретки
\s
[ \t\v\r\n\f]
пробельный символ
\S
[^\s]
любой символ, кроме промельного
\t
табуляция
\w
[0-9a-z_]
любая цифра, буква или знак подчеркивания
\W
[^\w]
любой символ, кроме цифры, буквы или знака подчеркивания
\v
вертикальная табуляция
Спецсимволы внутри символьного класса
Пример
Описание
^
[^da]
отрицание, любой символ кроме «d» или «a»
—
[a-z]
интервал, любой симво от «a» до «z»
Позиция внутри строки
Якоря
Якоря в регулярных выражениях указывают на начало или конец чего-либо. Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид:
Здесь символ ^ обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.
Символьные классы
Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \d соответствует любой цифре от 0 до 9 включительно, \w соответствует буквам и цифрам, а \W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:
POSIX
POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.
Утверждения
Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».
Итак, парсер проверяет несколько следующих символов по предложенному шаблону ( werty ). Если они найдены, то утверждение ложно, а значит символ q будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же werty не найдено, то утверждение верно, и с q все в порядке. Затем продолжается поиск любых символов, кроме пробела ( [^\s]* ).
Кванторы
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:
Приведенный выше шаблон найдет в этой строке вот такую подстроку:
Он оказался слишком жадным, захватив наибольший кусок текста, который смог.
Экранирование в регулярных выражениях
Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).
Шаблон для нахождения точки таков:
Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой.
Спецсимволы экранирования в регулярных выражениях
Подстановка строк
Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.
Группы и диапазоны
Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:
Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:
Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.
Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:
Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этой конкретной функции):
Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:
Модификаторы шаблонов
Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.
Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:
Модификаторы добавляются в конец этой строки, вот так:
Мета-символы
Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:
Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.
Регулярное выражение для извлечения текста между квадратными скобками
Простой вопрос с регулярным выражением. У меня есть строка в следующем формате:
Что такое регулярное выражение для извлечения слов в квадратных скобках, т.е.
Примечание. В моем примере использования скобки не могут быть вложены.
ОТВЕТЫ
Ответ 1
Вы можете использовать следующее регулярное выражение глобально:
Ответ 2
Будет захватывать контент без скобок
РЕДАКТИРОВАТЬ: для вложенных скобок должно работать приведенное ниже регулярное выражение:
Ответ 3
Это должно работать нормально:
Ответ 4
Могут ли скобки быть вложенными?
Если нет: \[([^]]+)\] соответствует одному элементу, включая квадратные скобки. Backreference \1 будет содержать элемент, который будет соответствовать. Если ваш аромат регулярного выражения поддерживает поиск, используйте
Это будет соответствовать только элементу внутри скобок.
Ответ 5
(? работает хорошо в соответствии с приведенным выше объяснением. Вот пример Python:
Ответ 6
Если вы не хотите включать скобки в совпадение, используйте регулярное выражение: (?
Пусть разбить это
Смотри вперед позитивно (? =)
Найдите выражение A, за которым следует выражение B:
Смотреть за положительным (? (?
Альтернатива
Если ваш движок регулярных выражений не поддерживает предпросмотры и предпросмотры, то вы можете использовать регулярное выражение \[(.*?)\] Для захвата внутренних скобок в группе, а затем при необходимости управлять группой.
Как работает это регулярное выражение?
Ответ 7
Выше должно работать, учитывая следующее объяснение
символы в квадратных скобках [] определяет класс characte, который означает, что шаблон должен совпадать по крайней мере с одним символом, указанным в квадратных скобках
\ s указывает пробел
+ означает, что по крайней мере один из символов, упомянутых ранее, на +.
Ответ 8
Этот код будет извлекать содержимое между квадратными скобками и круглыми скобками
Ответ 9
Ответ 10
если вы хотите заполнить только маленькую букву алфавита между квадратными скобками a-z
если вы хотите маленькие буквы и заглавные буквы a-zA-Z
Сделаем что-то более сложное – регулярное выражение, которое соответствует домену сайта.
Как видно, домен состоит из повторяющихся слов, причём после каждого, кроме последнего, стоит точка.
На языке регулярных выражений (\w+\.)+\w+ :
Пример: email
Предыдущий пример можно расширить, создав регулярное выражение для поиска email.
Это регулярное выражение не идеальное, но, как правило, работает и помогает исправлять опечатки. Окончательную проверку правильности email, в любом случае, можно осуществить, лишь послав на него письмо.
Содержимое скобок в match
Скобочные группы нумеруются слева направо. Поисковый движок запоминает содержимое, которое соответствует каждой скобочной группе, и позволяет получить его в результате.
Например, мы хотим найти HTML теги и обработать их. Было бы удобно иметь содержимое тега (то, что внутри уголков) в отдельной переменной.
Теперь получим как тег целиком
, так и его содержимое h1 в виде массива:
Вложенные группы
Скобки могут быть и вложенными.
Например, при поиске тега в нас может интересовать:
Вот их номера (слева направо, по открывающей скобке):
По нулевому индексу в result всегда идёт полное совпадение.
Соответствие для каждой группы в строке:
Необязательные группы
А теперь более сложная ситуация для строки ac :
Поиск всех совпадений с группами: matchAll
Метод не поддерживается в старых браузерах.
При поиске всех совпадений (флаг g ) метод match не возвращает скобочные группы.
Например, попробуем найти все теги в строке:
Результат – массив совпадений, но без деталей о каждом. Но на практике скобочные группы тоже часто нужны.
В явном преобразовании через Array.from нет необходимости, если мы перебираем результаты в цикле, вот так:
…Или используем деструктуризацию:
Зачем так сделано? Причина проста – для оптимизации.
При вызове matchAll движок JavaScript возвращает перебираемый объект, в котором ещё нет результатов. Поиск осуществляется по мере того, как мы запрашиваем результаты, например, в цикле.
Таким образом, будет найдено ровно столько результатов, сколько нам нужно.
Именованные группы
Запоминать группы по номерам не очень удобно. Для простых шаблонов это допустимо, но в сложных регулярных выражениях считать скобки затруднительно. Гораздо лучше – давать скобкам имена.
Например, поищем дату в формате «год-месяц-день»:
Скобочные группы при замене
Например, заменим даты в формате «год-месяц-день» на «день.месяц.год»:
Бывает так, что скобки нужны, чтобы квантификатор правильно применился, но мы не хотим, чтобы их содержимое было выделено в результате.
В примере ниже мы получим только имя John как отдельный элемент совпадения:
Итого
Круглые скобки группируют вместе часть регулярного выражения, так что квантификатор применяется к ним в целом.
Часть совпадения, соответствующую скобочной группе, мы можем получить в результатах поиска.
Задачи
Найти цвет в формате #abc или #abcdef
P.S. Это должно быть ровно 3 или 6 шестнадцатеричных цифр. При этом значения с 4-мя цифрами типа #abcd не должны совпадать в результат.
Нам нужно найти ещё ровно 3 дополнительных шестнадцатеричных цифры. Ни больше ни меньше – в цвете либо 3, либо 6 цифр.
Здесь шаблон [a-f0-9] <3>заключён в скобки для корректного применения к нему квантификатора <1,2>.
Простой синтаксис регулярных выражений и часто используемые регулярные выражения
^ Указывает начальную позицию совпадающей строки (кроме случаев, когда она используется в квадратных скобках [], ее можно понимать как обратную, указывая на то, что строка в скобках не совпадает)
$ Означает конечную позицию совпадающей строки
* Значения соответствуют нулю во много раз
+ Значения совпадают один или несколько раз (хотя бы один раз)
? Означает ноль или одно совпадение
. Означает совпадение с одним символом
| Обозначается как или, выберите один из двух
() Скобки означают совпадение всех символов в скобках
[】] Скобки означают совпадение с одним символом в скобках Описание диапазона, например [0-9 a-z A-Z]
<> Скобки используются для ограничения количества совпадений. Например, означает совпадение n символов. означает сопоставление не менее n символов. означает не менее n, не более m
\ Escape-символ Как и выше, базовое сопоставление символов должно быть экранированным. Например, \ * означает совпадение *
\ w означает английские буквы и цифры \ W не буквы и цифры
\ d означает число \ D не число
Несколько простых инструкций и случаев
1. Правила соответствия для регулярных выражений
Большинство символов в регулярном выражении являются буквальными значениями, такими как / a / совпадает с, / b / соответствует b. Если в регулярном выражении,
Символ представляет только его буквальное значение (точно так же как a и b выше), тогда они называются «буквальными символами».
Собака в регулярном выражении в приведенном выше коде является буквальным символом, поэтому / собака / соответствует старой собаке, потому что это означает, что три буквы d, o и g связаны друг с другом.
* Соответствует одному символу
2.1 точка (.)
Совпадение всех символов, кроме возврата каретки (\ r), перевода строки (\ n), разделителя строк (\ u2028) и разделителя абзацев (\ u2029).
// Обратите внимание, что если кодовая точка больше 0xFFFF, символ точки не может быть правильно сопоставлен, и он будет считаться двумя символами.
2.2 Положение символов
^^ указывает начальную позицию совпадающей строки (кроме случаев, когда она используется в квадратных скобках [], ее можно понимать как обратную, указывая, что она не совпадает со строкой в скобках)
$ Указывает конечную позицию совпадающей строки
// 2.3 selector (|) Символ вертикальной черты (|) означает «или отношение» (OR) в регулярном выражении, то есть cat | dog означает совпадение с cat или dog.
Метасимволам, имеющим особое значение в регулярных выражениях, должен предшествовать обратный слеш, если они хотят соответствовать себе. Например, чтобы соответствовать +, он должен быть записан как \ +. с
// Если вы используете метод RegExp для генерации обычных объектов, вам нужно использовать две косые черты для экранирования, потому что строка будет экранирована один раз.
\\ [\ b] соответствует клавише возврата (U + 0008), не путать с \ b.
\ N Совпадение с ключом новой строки.
\ r соответствует клавише Enter.
\ T соответствует символу табуляции (U + 0009).
\ V соответствует вертикальной вкладке (U + 000B).
\ F соответствует подаче формы (U + 000C).
\ 0 соответствует нулевому символу (U + 0000).
\ Xhh соответствует символу, представленному двумя шестнадцатеричными числами (\ x00- \ xFF).
\ Uhhhh соответствует символу Unicode, выраженному четырехзначным шестнадцатеричным числом (\ u0000- \ uFFFF).
Класс символов (class) означает, что на выбор предлагается серия символов, если она соответствует одному из них. Все доступные символы заключены в квадратные скобки. Например, [xyz] означает любое совпадение из x, y и z.
5,1 символов (^)
Экранирующий символ имеет особое значение только в первой позиции класса символов, в противном случае это буквальное значение.
5.2 Дефис (-)
Используется для предоставления краткой формы для представления непрерывного диапазона символов.
6. Режим предварительной компиляции
\ d соответствует любому числу от 0 до 9, эквивалентному 5.
\ D соответствует всем символам, кроме 0-9, что эквивалентно [^ 0-9].
\ s соответствует пробелам (включая переводы строк, табуляции, пробелы и т. д.), что эквивалентно [\ t \ r \ n \ v \ f].
\ S соответствует непробельным символам, эквивалентным [^ \ t \ r \ n \ v \ f].
\ b Совпадение границ слов.
\ B соответствует границе без слова, то есть внутри слова.
Количество точных совпадений шаблона указывается фигурными скобками (<>). означает повторение ровно n раз, означает повторение не менее n раз, означает повторение не менее n раз, не более m раз.
Квантификаторы используются для установки количества вхождений шаблона.
Знак вопроса означает, что определенный шаблон появляется 0 или 1 раз, что эквивалентно <0, 1>.
* Звездочка указывает, что определенный шаблон появляется 0 или более раз, что эквивалентно <0,>.
+ Знак плюс означает, что шаблон появляется один или несколько раз, что эквивалентно <1,>.
Три указанных выше квантификатора являются максимально возможными совпадениями по умолчанию, то есть сопоставлением, пока следующий символ не будет соответствовать правилам сопоставления. Это называется жадным режимом.
Модификатор указывает на дополнительные правила шаблона и размещается в самом конце обычного шаблона. Модификаторы можно использовать по отдельности или несколькими.
10,1 г модификатора
По умолчанию после успешного первого совпадения обычные объекты перестают совпадать вниз. Модификатор g указывает на глобальное соответствие (global). После добавления обычный объект будет соответствовать всем результатам, которые соответствуют условиям, в основном используемым для поиска и замены.
10.2 я модификатор
По умолчанию обычные объекты различают прописные и строчные буквы, а модификатор i добавляет регистр игнорирования.
Модификатор 10,3 м
11. Шаблон комбинации: в скобках регулярного выражения указывается соответствие группы, а шаблоны в скобках можно использовать для соответствия содержимому группы.
Интеллектуальная рекомендация
Что такое сущность архитектуры Super-Fusion (ниже): иерархическое хранение
Эта статья перепечатает от [Smartx Super-Integration] Wechat Public Account, нажмитеЗдесьВы можете прочитать оригинальный текст. В предыдущей статье «Какова сущность архитектуры Super-Fusion (ON.