Регэкспы что это: Regexp — это «язык программирования». Основы / Хабр
Regexp — это «язык программирования». Основы / Хабр
Несколько лет назад я думал, что regexp осуществляет линейный поиск по тексту, но какое моё удивление было, когда я понял, что это не так. Тогда я убедился на собственном опыте, что от простой смены местами а и b в схеме (…a…)|(…b…) поменялся полностью результат.
Поэтому сейчас я расскажу, как на самом деле работает regexp.
Поняв эти простые принципы и как оно работает, вы сможете писать любые запросы.
Для примера, я разберу сложную при первом приближении, но на самом деле простейшую задачу – выявление всех строк в кавычках.
Ветвления в regexp
Регулярные выражения работают по схеме направленного дерева.
Например ветвление (a …)|(b …)|(c …) можно записать:If (char=='a'){
...
}else if (char =='b'){
...
}else if (char =='c'){
...
}
Именно поэтому перестановка местами 'b ...' и 'a . ..'
влияет на результат – потому что здесь расставляются приоритеты выполнения (в каком порядке поставишь, так и будет выполняться).
Именно поэтому стоит следить за тем, что приоритетнее и стараться условия делать оптимально вытесняющими друг друга.
Причём выполняться всё, что за ‘a’ будет при условии того, что всё до ‘a’ (включая ‘a’) выполнено.
Пишем парсер кавычек
Рассмотрим простой пример.
Давайте возьмём подопытную строку 123"ABC\"D\EF"GHI""\"KEY
и начнём над ней издеваться:
Первое, что появляется в голове — /".*"/
выражение. Оно будет действовать по алгоритму:
1) Производим поиск первой одной "
2) Пока у нас любой символ (в том числе и "
), мы проходим дальше
3) В конце должна быть тоже "
В результате, правильно, мы получили "ABC\"D\EF"GHI""\"
.
То есть нашли первую кавычку. Дальше, пока выполнялось условие брали следующие символы (в том числе и "
) и делали, пока последней не оказалась "
. \\\\]. (см. последний пример) В этом случае, нахождения в строке «\» не произойдёт, как и должно быть.
regexp
Регулярное выражение в виде вектора символов, массива ячеек из символьных векторов или массива строк. Каждое выражение может содержать символы, метасимволы, операторы, лексемы и флаги, которые задают шаблоны, чтобы соответствовать в str
.
Следующие таблицы описывают элементы регулярных выражений.
Метасимволы
Метасимволы представляют буквы, обозначают буквами области значений, цифры и пробелы. Используйте их, чтобы создать обобщенный шаблон символов.
Метасимвол | Описание | Пример |
---|---|---|
| Любой отдельный символ, включая пробел |
|
| Любой символ содержится в квадратных скобках. *rp]ain’ соответствия все последовательности с четырьмя буквами тот конец в | |
| Любой символ в области значений |
|
| Любой алфавитный, числовой, или символ подчеркивания. Для английских наборов символов, |
|
| Любой символ, который не является алфавитным, числовым, или подчеркивание. 0-9] |
|
| Символ восьмеричного значения |
|
| Символ шестнадцатеричного значения |
|
Символьное представление
Оператор | Описание |
---|---|
| Предупреждение (звуковой сигнал) |
| Клавиша Backspace |
| Перевод формата |
| Новая строка |
| Возврат каретки |
| Горизонтальная табуляция |
| Вертикальная табуляция |
| Любой символ с особым значением в регулярных выражениях, с которыми вы хотите совпадать буквально (например, используйте |
Кванторы
Кванторы задают число раз, шаблон должен произойти в совпавшем тексте.
Квантор | Выражение числа раз происходит | Пример |
---|---|---|
| 0 или больше раз последовательно. |
|
| 0 раз или в 1 раз. |
|
| 1 или более раз последовательно. |
|
| По крайней мере {0,1} |
|
| По крайней мере {0,} |
|
| Точно Эквивалентный |
|
Кванторы могут появиться в трех режимах, описанных в следующей таблице. q представляет любой из кванторов в предыдущей таблице.
Режим | Описание | Пример |
---|---|---|
| Жадное выражение: совпадайте с как можно большим количеством символов. | Учитывая текст
|
| Ленивое выражение: совпадайте с таким же небольшим количеством символов по мере необходимости. | Учитывая text |
| Притяжательное выражение: соответствуйте как можно больше, но не повторно сканируйте фрагменты текста. | Учитывая text |
| Сгруппируйтесь атомарно. Не отслеживайте в обратном порядке в группе, чтобы завершить соответствие и не получить лексемы. |
|
| Совпадайте с выражением Если существует соответствие с Можно включать |
|
Привязки
Привязки в выражении совпадают с началом или концом входного текста или слова. M\w*’ распознает слово начиная с M
в начале текста.
expr$
Конец входного текста.
'\w*m$'
слова соответствий, заканчивающиеся m
в конце текста.
\<expr
Начало слова.
'\<n\w*'
распознает любые слова начиная с n
.
expr\>
Конец слова.
'\w*e\>'
соответствия любые слова, заканчивающиеся e
.
Утверждения Lookaround
Утверждения Lookaround ищут шаблоны, которые сразу предшествуют или следуют за намеченным соответствием, но не являются частью соответствия.
Указатель остается в текущем местоположении и символах, которые соответствуют test
выражение не получено или отброшено. Поэтому предварительные утверждения могут совпадать с перекрывающимися группами символов.
Утверждение Lookaround | Описание | Пример |
---|---|---|
| Предусмотрите для символов то соответствие |
|
| Смотрите вперед для символов, которые не совпадают |
|
| Оглянитесь для символов то соответствие |
|
| Оглянитесь для символов, которые не совпадают | |
| Совпадайте |
|
Логические и условные операторы
Логические и условные операторы позволяют вам тестировать состояние данного условия, и затем использовать результат, чтобы определить который шаблон, если таковые имеются, соответствовать затем. Эти операторы поддерживают логический OR
, и if
или if/else
условия.
Условиями могут быть лексемы, lookaround операторы или динамические выражения формы (?@cmd)
. Динамические выражения должны возвратить логическое или числовое значение.
Условный оператор | Описание | Пример |
---|---|---|
| Совпадайте с выражением Если существует соответствие с |
|
| Если условие |
|
| Если условие |
|
Маркерные операторы
Лексемы являются фрагментами совпадающего текста, который вы задаете путем включения части регулярного выражения в круглых скобках. Можно обратиться к лексеме ее последовательностью в тексте (порядковая лексема) или присвоить имена к лексемам для более легкого обслуживания кода и читаемого выхода.
Порядковый маркерный оператор | Описание | Пример |
---|---|---|
| Получите в лексеме символы, которые совпадают с заключенным в нихом выражение. |
|
| Совпадайте |
|
| Если |
|
Названный маркерный оператор | Описание | Пример |
---|---|---|
| Получите в именованной лексеме символы, которые совпадают с заключенным в нихом выражение. |
|
| Совпадайте с лексемой, упомянутой |
|
| Если именованная лексема найдена, то совпадайте |
|
Примечание
Если выражение вложило круглые скобки, MATLAB® получает лексемы, которые соответствуют наиболее удаленному набору круглых скобок. Например, учитывая поисковый шаблон '(and(y|rew))'
, MATLAB создает лексему для 'andrew'
но не для 'y'
или 'rew'
.
Динамические регулярные выражения
Динамические выражения позволяют вам выполнять команду MATLAB или регулярное выражение, чтобы определить текст, чтобы соответствовать. (\d+)((??\\w{$1}))’ определяет сколько символов, чтобы соответствовать путем чтения цифры в начале соответствия. Динамическое выражение заключено во второй набор круглых скобок так, чтобы получившееся соответствие было получено в лексеме. Например, соответствие с '5XXXXX'
лексемы получений для '5'
и 'XXXXX'
.
(??@cmd)
Выполните команду MATLAB, представленную cmd
, и включайте выходной параметр, возвращенный командой в выражении соответствия.
'(.{2,}).?(??@fliplr($1))'
находит палиндромы, которые являются по крайней мере четырьмя символами долго, такими как 'abba'
.
(?@cmd)
Выполните команду MATLAB, представленную cmd
, но отбросьте любой выходной параметр, который возвращает команда. (Полезный для диагностирования регулярных выражений.)
'\w*?(\w)(?@disp($1))\1\w*'
распознает слова, которые включают двойные буквы (такие как pp
), и отображает промежуточные результаты.
В рамках динамических выражений используйте следующие операторы, чтобы задать текст замены.
Заменяющий оператор | Описание |
---|---|
| Фрагмент входного текста, который является в настоящее время соответствием |
| Фрагмент входного текста, который предшествует текущему соответствию |
| Фрагмент входного текста, который следует за текущим соответствием (используют |
|
|
| Названная лексема |
| Выведите возвратился, когда MATLAB выполняет команду, |
Комментарии
‘characters’ | Описание | Пример |
---|---|---|
(?#comment) | Вставьте комментарий в регулярное выражение. Текст комментария проигнорирован при соответствии с входом. |
|
Поисковые флаги
Поисковые флаги изменяют поведение для соответствия с выражениями. Альтернатива использованию поискового флага в рамках выражения должна передать option
входной параметр.
Флаг | Описание |
---|---|
(?-i) | Совпадайте с регистром (значение по умолчанию для |
(?i) | Не совпадайте с регистром (значение по умолчанию для |
(?s) | Точка соответствия ( |
(?-s) | Точка соответствия в шаблоне с любым символом, который не является символом новой строки. и |
(?-x) | Включайте пробелы и комментарии при соответствии (значение по умолчанию). |
(?x) | Проигнорируйте пробелы и комментарии при соответствии. |
Выражение, которое изменяет флаг, может появиться любой после круглых скобок, такой как
или в круглых скобках и разделенный от флага с двоеточием (:
), такой как
Последний синтаксис позволяет вам изменять поведение для части большего выражения.
Типы данных: char |
cell
| string
RegExp [АйТи бубен]
Регулярные выражения (regular expressions, сокр. RegExp, RegEx) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (wildcard characters). По сути это строка-шаблон (pattern), состоящая из символов и метасимволов и задающая правило поиска.
При реализации механизмов регулярных выражений обычно используются две базовые технологии: НКА (недетерминированный конечный автомат) и ДКА (детерминированный конечный автомат). Механизмы отличаются подходом к сравнению регулярного выражений со строкой. Говорят, что механизм НКА «управляется регулярным выражением», а механизм ДКА «управляется текстом». Самым распространенным является НКА.
При изучении любого языка с поддержкой регулярных выражений необходимо различать два аспекта – диалект регулярных выражений (состав и интерпретация поддерживаемых метасимволов) и синтаксис работы с регулярными выражениями в самом языке. Метод реализации механизма регулярных выражений, выбранный разработчиком языка или программы, заметно влияет на результаты применения любого регулярного выражения.
Невозможно построить универсальное регулярное выражения в отрыве от контента. …]
?
*
\A
$
\Z \z
\< или \b
/> или \b
\b
\B
|
(…)
(?:…)
\1,\2,…
\a
\e
\f
\n
\r
\t
Регулярное выражение .* всегда распространяет совпадение до конца строки. Это связано с тем, что .* стремится захватить все, что может. Впрочем, позднее часть захваченного может быть возвращена, если это необходимо для общего совпадения. Иногда это поведение вызывает немало проблем. Рассмотрим регулярное выражение для поиска текста, заключенного в кавычки. На первый взгляд напрашивается простое ".*", но попробуйте на основании того, что нам известно о .*, предположить, какое совпадение будет найдено в строке:
The name "McDonald's" is said "makudonarudo" in Japanese
После совпадения первого символа " управление передается конструкции .*, которая немедленно захватывает все символы до конца строки. Она начинает нехотя отступать (под нажимом механизма регулярных выражений), но только до тех пор, пока не будет найдено совпадение для последней кавычки. Если прокрутить происходящее в голове, вы поймете, что найденное совпадение будет выглядеть так(выделено нижним подчеркиванием):
The name "McDonald's" is said "makudonarudo" in Japanese
Найден совсем не тот текст, который мы искали. "\n].
В некоторых вариантах НКА поддерживаются минимальные квантификаторы, при этом *? является минимальным аналогом квантификатора *. Квантификатор стремится к минимальному захвату.
В Unicode определяется несколько символов (а также одна последовательность из двух символов), которые считаются завершителями строк (line terminators).
Завершители строк в Юникоде | |
---|---|
Символ | Описание |
LF U+000A | Перевод строки (ASCII) |
VT U+000B | Вертикальная табуляция (ASCII) |
FF U+000C | Перевод формата (ASCII) |
CR U+000D | Возврат каретки (ASCII) |
CR/LF U+000D U+000A | Возврат каретки/перевод строки (ASCII последовательность) |
NEL | Следующая строка (Юникод) |
LS U+2028 | Разделитель строк (Юникод) |
PS U+2029 | Разделитель абзацев (Юникод) |
При наличии полноценной поддержки со стороны программы завершители строк влияют на результаты чтения строк из файла (в сценарных языках – включая файл, из которого читается программа). , $ и \Z
Примеры использования:
Свойства Unicode, алфавиты и блоки: \р{свойство}, \Р{свойство}. На концептуальном уровне Юникод представляет собой отображение множества символов на множество кодов, но стандарт Юникода не сводится к простому перечислению пар. Он также определяет атрибуты символов (например, «этот символ является строчной буквой», «этот символ пишется справа налево», «этот символ является диакритическим знаком, который должен объединяться с другим символом» и т. д.).
Уровень поддержки этих атрибутов зависит от конкретной программы, но многие программы с поддержкой Юникода позволяют находить хотя бы некоторые из них при помощи конструкций \p{атрибут} (символ, обладающий указанным атрибутом) и \P{атрибут} (символ, не обладающий атрибутом).
Рекомендации по оптимизации регулярных выражений.
Задача: Разбить число на разряды например запятыми. Формально задача выглядит так «вставить запятые во всех позициях, у которых количество цифр справа кратно трем, а слева есть хотя бы одна цифра»
Второе требование выполняется при помощи ретроспективной проверки. Одной цифры слева достаточно для выполнения этого требования, а этот критерий задается выражением (?⇐\d).
Группа из трех цифр определяется выражением \d\d\d. Заключим ее в конструкцию (…)+, чтобы совпадение могло состоять из нескольких групп, и завершим метасимволом $, чтобы гарантировать отсутствие символов после совпадения. Само по себе выражение (\d\d\d)+$ совпадает с группами из трех цифр, следующими до конца строки, но в конструкции опережающей проверки (?=…) оно совпадает с позицией, справа от которой до конца строки следуют группы из трех цифр. Однако перед первой цифрой запятая не ставится, поэтому совпадение дополнительно ограничивается ретроспективной проверкой (?⇐\d).
Чтобы выражение стало более эффективным можно добавить несохраняющие скобки ?: в (?:\d\d\d), в этом случае подсистема регулярных выражений не будет тратить ресурсы на сохранение текста в круглых скобках.
12. Регулярные выражения [Zabbix Documentation 5.2]
Обзор
Zabbix поддерживает Perl совместимые регулярные выражения (PCRE).
Имеется два варианта использования регулярных выражений в Zabbix:
ввод регулярного выражения вручную
использование глобальных регулярных выражений созданных в Zabbix
Регулярные выражения
Вы можете вручную ввести регулярное выражение в поддерживаемых местах. Обратите внимание, что в этом случае выражение может не начинаться с @, так как этот символ в Zabbix используется как ссылка на глобальные регулярные выражения.
Глобальные регулярные выражения
В Zabbix веб-интерфейсе имеется продвинутый редактор для создания и тестирования сложных регулярных выражений.
После того как регулярное выражение создано, его можно использовать в нескольких местах веб-интерфейса, используя ссылку на его имя с префиксом @, например, @мое_пользовательское_выражение.
Для создания глобального регулярного выражения:
Перейдите в: Администрирование → Общие
Выберите Регулярные выражения в выпадающем списке
Нажмите на Новое регулярное выражение
Вкладка Выражения позволяет указать имя регулярного выражения и добавить подвыражения.
Все обязательные поля ввода отмечены красной звёздочкой.
Параметр | Описание | |
---|---|---|
Имя | Укажите имя регулярного выражения. Разрешены любые Unicode символы. | |
Выражения | Нажмите на Добавить в Блоке выражений для того, чтобы добавить новое подвыражение. | |
Тип выражения | Выберите тип выражения: Строка символов включена - совпадение по подстроке Любоая строка символов включена - совпадение по любой из подстрок из списка с разделителями. Разделители в списке включают в себя запятую (,), точку (.) или прямую косую черту (/). Строка символов не включена - совпадение по любой строке за исключением подстроки Результат ПРАВДА - совпадение с регулярным выражением Результат ЛОЖЬ - отсутствие совпадения с регулярным выражением | |
Выражение | Укажите подстроку/регулярное выражение. | |
Разделитель | Запятая (,), точка (.) или прямая косая черта (/) для разделения текстовых строк в регулярном выражении. Этот параметр доступен только когда выбран режим типа выражения “Любоая строка символов включена”. | |
Регистрозависимое | Отметьте эту опцию чтобы указать является ли регулярное выражение чувствительным к регистру букв. |
Начиная с Zabbix 2.4.0, косая черта (/) в выражении воспринимается буквально, нежели как разделитель. Таким образом возможно сохранить выражения содержащие косую черту, тогда как ранее такая запись приводила к ошибке.
В Zabbix имя пользовательского регулярного выражения может содержать запятые, пробелы и т.п. В этих случаях, там где имеется вероятность неверной интерпретации при использовании ссылки (например, запятая в параметре ключа элемента данных) нужно всю ссылку заключить в кавычки, вот таким образом: "@Мое выражение для цели, цели2". TESTDATABASE$
Выбран Тип выражения: "Результат ЛОЖЬ". Не соответствует имени, содержащему строку “TESTDATABASE”.
Пример с использованием inline модификатора регулярного выражения
Использование следующего регулярного выражения, которое включает inline модификатор (?i) для поиска соответствия символов “error”:
(?i)error
Выбран Тип выражения: "Релультат ПРАВДА". Символы “error” совпадают.
Другой пример с использованием inline модификатора регулярного выражения
Использование следующего регулярного выражения, которое включает несколько inline модификаторов для поиска соответствия символов после указанной строки:
(?<=match (?i)everything(?-i) after this line\n)(?sx).*# мы добавили s модификатор, чтобы разрешить . соответствие символам перехода на новую строку
Выбран Тип выражения: "Релультат ПРАВДА". Символы после указанной строки совпадают.
Модификатор g нельзя указывать в строке. Список доступных модификаторов можно найти на странице помощи по pcresyntax [en]. Для получения более подробной информации о синтаксисе PCRE, пожалуйста, обратитесь к PCRE HTML документации [en].
Более сложный пример
Пользовательское регулярное выражение может состоять из нескольких подвыражений, и их можно протестировать на вкладке Тест, используя тестовую строку.
Результаты покажут состояние каждого подвыражения и суммарное состояние для всего пользовательского выражения.
Общее состояние пользовательского выражения определяется как Комбинированный результат. Если задано несколько подвыражений, для вычисления Комбинированного результата Zabbix использует логический оператор И. Такое поведение означает, если по крайней мере один Результат является ЛОЖЬЮ, тогда Комбинированный результат будет также иметь состояние Ложь.
Объяснение глобальных регулярных выражений
Глобальное регулярное выражение | Выражение | Описание |
---|---|---|
File systems for discovery | ^(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|refs|ntfs|fat32|zfs)$ | Соответствие “btrfs” или “ext2” или “ext3” или “ext4” или “jfs” или “reiser” или “ xfs” или “ffs” или “ufs” или “jfs” или “jfs2” или “vxfs” или “hfs” или “refs” или “ntfs” или “fat32” или “zfs” |
Network interfaces for discovery | ^Software Loopback Interface | Соответствие строкам, которые начинаются с “Software Loopback Interface” |
^lo$ | Соответствие “lo” | |
^(In)?[Ll]oop[Bb]ack[0-9. (automatic|automatic delayed)$ | Соответствие “automatic” или “automatic delayed”. |
Поддержка регулярных выражений по назначению
Назначение | Регулярное выражение | Глобальное регулярное выражение | Комментарии | |
---|---|---|---|---|
Элементы данных агента | ||||
eventlog[] | Да | Да | Параметры регулярное выражение , важность , источник , eventid | |
log[] | Параметр регулярное выражение | |||
log.count[] | ||||
logrt[] | Да/Нет | Параметр регулярное выражение поддерживает оба варианта, параметр регулярное_выражение_файла поддерживает только не глобальные выражения | ||
logrt. count[] | ||||
proc.cpu.util[] | Нет | Параметр cmdline | ||
proc.mem[] | ||||
proc.num[] | ||||
sensor[] | Параметры устройство и датчик в Linux 2.4 | |||
system.hw.macaddr[] | Параметр интерфейс | |||
system.sw.packages[] | Параметр пакет | |||
vfs.dir.count[] | Параметры regex_вкл и regex_искл | |||
vfs.dir.size[] | Параметры regex_вкл и regex_искл | |||
vfs.file.regexp[] | Параметр регулярное выражение | |||
vfs.file.regmatch[] | ||||
web.page.regexp[] | ||||
SNMP трапы | ||||
snmptrap[] | Да | Да | Пареметр regexp | |
Предобработка значений элементов данных | Да | Нет | Параметр шаблон | |
Функции триггеров | ||||
count() | Да | Да | Параметр шаблон , если параметр оператор равен regexp или iregexp | |
logeventid() | Параметр шаблон | |||
logsource() | ||||
iregexp() | ||||
regexp() | ||||
Низкоуровневое обнаружение | Да | Да | Поле Фильтр | |
Веб-мониторинг | Да | Нет | Переменные с префиком regex: Поле Требуемая строка | |
Функции макросов | ||||
regsub() | Да | Нет | Параметр шаблон | |
iregsub() | ||||
Соответствие иконок | Да | Да | Поле Выражение |
Введение в регулярные выражения в JavaScript | by Victoria Likhanova | NOP::Nuances of Programming
Первым делом необходимо выяснить, что такое регулярные выражения. Регулярные выражения — это способ описания шаблона или правила. Их можно использовать, чтобы проверить, есть ли в строке совпадения с шаблоном. Плюс регулярных выражений в том, что их можно использовать во многих языках программирования.
Регулярные выражения — это не просто ещё одна часть языка 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
Примечание: два слэша в литерале регулярных выражений используются для того, чтобы заключить в них шаблон. Если ваш шаблон предполагает использование ещё одного или нескольких прямых слэшей, их необходимо экранировать обратным слэшем (\
), то есть \ /.
Конструктор или литерал?
Конструктор и литерал выполняют одну функцию, но есть одно важное различие. Регулярное выражение, созданное при помощи конструктора, компилируется при выполнении программы, литерал — на этапе загрузки скрипта. Это значит, что литерал нельзя изменить динамически, в то время как конструктор — можно.
Таким образом, если вам нужно (или может понадобиться) изменить шаблон на лету, создавайте регулярное выражение с помощью конструктора. Также конструктор будет лучшим решением, если шаблон нужно создавать динамически. С другой стороны, если вам не понадобится менять или создавать шаблон, вы можете воспользоваться литералом.
Прежде чем приступить к созданию шаблонов, давайте кратко рассмотрим, как они используются. С помощью описанных ниже методов мы сможем в дальнейшем применять разные способы создания шаблонов.
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
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
До сих пор мы использовали регулярные выражения из простых шаблонов. \t\r\n\v\f]).
Примеры:
// . - любой символ, кроме первой строки
const myPattern = /./console.log(myPattern.test(''))
// falseconsole.log(myPattern.test('word'))
// trueconsole.log(myPattern.test('9'))
// true
// \d - одноразрядное число
const myPattern = /\d/console.log(myPattern.test('3'))
// trueconsole.log(myPattern.test('word'))
// false
// \w - отдельный буквенно-числовой словообразующий символ
const myPattern = /\w/console.log(myPattern.test(''))
// falseconsole.log(myPattern.test('word'))
// trueconsole.log(myPattern.test('9'))
// true
// \s - отдельный символ разделителя
const myPattern = /\s/console.log(myPattern.test(''))
// falseconsole.log(myPattern.test(' '))
// trueconsole.log(myPattern.test('foo'))
// false
// \D - отдельный нечисловой символ
const myPattern = /\D/console. log(myPattern.test('Worm'))
// trueconsole.log(myPattern.test('1'))
// false
// \W - отдельный несловообразующий символ
const myPattern = /\W/console.log(myPattern.test('Worm'))
// falseconsole.log(myPattern.test('1'))
// falseconsole.log(myPattern.test('*'))
// trueconsole.log(myPattern.test(' '))
// true
// \S - отдельный символ, который не является разделителем
const myPattern = /\S/console.log(myPattern.test('clap'))
// trueconsole.log(myPattern.test(''))
// falseconsole.log(myPattern.test('-'))
// true
Операторы контроля
Ещё один вид специальных символов — это операторы контроля. Такие символы позволяют описывать шаблоны с границами, то есть указывать, где начинается или заканчивается слово или строка. С помощью операторов контроля также можно создавать более сложные шаблоны, такие как опережающие проверки, ретроспективные проверки и условные выражения. re/console.log(myPattern.test('write'))
// falseconsole.log(myPattern.test('read'))
// trueconsole.log(myPattern.test('real'))
// trueconsole.log(myPattern.test('free'))
// false
// $ - Конец строки
const myPattern = /ne$/console.log(myPattern.test('all is done'))
// trueconsole.log(myPattern.test('on the phone'))
// trueconsole.log(myPattern.test('in Rome'))
// falseconsole.log(myPattern.test('Buy toner'))
// false
// \b - Граница слова
const myPattern = /\bro/console.log(myPattern.test('road'))
// trueconsole.log(myPattern.test('steep'))
// falseconsole.log(myPattern.test('umbro'))
// false// Или
const myPattern = /\btea\b/console.log(myPattern.test('tea'))
// trueconsole.log(myPattern.test('steap'))
// falseconsole.log(myPattern.test('tear'))
// false
// \B - Несловообразующая граница
const myPattern = /\Btea\B/console. log(myPattern.test('tea'))
// falseconsole.log(myPattern.test('steap'))
// trueconsole.log(myPattern.test('tear'))
// false
// x(?=y) - Опережающая проверка
const myPattern = /doo(?=dle)/console.log(myPattern.test('poodle'))
// falseconsole.log(myPattern.test('doodle'))
// trueconsole.log(myPattern.test('moodle'))
// false
// x(?!y) - Негативная опережающая проверка
const myPattern = /gl(?!u)/console.log(myPattern.test('glue'))
// falseconsole.log(myPattern.test('gleam'))
// true
// (?<=y)x - Ретроспективная проверка
const myPattern = /(?<=re)a/console.log(myPattern.test('realm'))
// trueconsole.log(myPattern.test('read'))
// trueconsole.log(myPattern.test('rest'))
// false
// (?<!y)x - Негативная ретроспективная проверка
const myPattern = /(?<!re)a/console.log(myPattern. test('break'))
// falseconsole.log(myPattern.test('treat'))
// falseconsole.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'))
// falseconsole.log(myPattern.test('bk'))
// trueconsole.log(myPattern.test('bok'))
// true
// + - 1 или более совпадений с предшествующим выражением
const myPattern = /\d+/console.log(myPattern.test('word'))
// falseconsole.log(myPattern.test(13))
// true
// ? - Предшествующее выражение необязательно, совпадений 0 или 1
const myPattern = /foo?bar/console.log(myPattern.test('foobar'))
// trueconsole.log(myPattern.test('fooobar'))
// false
// x{n} - Количество вхождений предшествующего выражения "x" равно "n"
const myPattern = /bo{2}m/console.log(myPattern.test('bom'))
// falseconsole.log(myPattern.test('boom'))
// trueconsole.log(myPattern.test('booom'))
// false
// x{n, } - Количество вхождений предшествующего выражения "x" равно, как минимум, "n"
const myPattern = /do{2,}r/console. 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.'))
// trueconsole.log(myPattern.test('Just a text'))
// false
// (?:x) - "x", значение не запоминается.
const myPattern = /(?:war)/console.log(myPattern.test('warsawwar'))
// trueconsole. log(myPattern.test('arsaw'))
// false
Альтернация
Альтернация позволяет находить соответствие, по крайней мере, одному из нескольких выражений.
/* Альтернация - Значение */
| - выражение до или после символа |, как в булевом ИЛИ (||).
Примеры:
// | - Выражение до или после символа |
const myPattern = /(black|white)swan/console.log(myPattern.test('black swan'))
// trueconsole.log(myPattern.test('white swan'))
// trueconsole.log(myPattern.test('gray swan'))
// false
Флаги
Флаги — последний тип символов, которые используются в регулярных выражениях. С помощью флагов можно легко расширить функционал шаблонов. К примеру, флаги позволяют игнорировать регистр букв, чтобы шаблон находил совпадения и в верхнем, и в нижнем регистрах, находить множественные совпадения и совпадения в многострочном тексте и т. д.
/* Флаг - Значение */
g – Глобальный поиск, не останавливается после нахождения первого совпадения. " и заканчивается "$" (начало и конец каждой строки).
Примеры:
// флаг g - Глобальный поиск
const myPattern = /xyz/gconsole.log(myPattern.test('One xyz and one more xyz'))
// true// флаг i - Игнорирование регистра
const myPattern = /xyz/iconsole.log(myPattern.test('XyZ'))
// true - регистр символов не имеет значения при нечувствительном к регистру поиске.
// флаг s - Точка (.) соответствует переводу на новую строку
const myPattern = /foo.bar/sconsole.log(myPattern.test('foo\nbar'))
// trueconsole.log(myPattern.test('foo bar'))
// trueconsole.log(myPattern.test('foobar'))
// false
Понимать и изучать регулярные выражения может быть непросто. Однако с помощью их короткого кода можно решать очень сложные задачи. И это определённо стоит стараний. Надеюсь, это руководство помогло вам разобраться в работе и способах применения регулярных выражений.
Читайте также:
Читайте нас в телеграмме, vk и Яндекс. Дзен
Регулярные выражения в Ruby— Ruby Rush
На повестке дня — регулярные выражения.
Мы познакомимся и немного поработаем с этим мощным инструментом, разобрав несколько примеров. А ближе к концу занятия — напишем увлекательную игру, применив полученные знания на практике.
План урока
- Что такое регулярные выражения
- Разбираем примеры
- Создаем игру «Придумай слова по шаблону»
- В каких ситуациях уместно использование регулярных выражений, а в каких лучше обойтись стандартными средствами
Что такое регулярные выражения
Регулярные выражения нужны для работы со строками.
Их используют, когда надо найти в строке совпадение с каким-то шаблоном, и сделать что-то, если это совпадение найдено, например, заменить часть строки другими символами.
Можно представить регулярные выражения в виде воронки:
Данная воронка пропускает только те слова, которые содержат в себе букву е
.
Регулярное выражение, записанное в слешах //
, как бы говорит нам, если найдешь в строке, к которой меня применили, букву, которая у меня между слешей (е
), то пропускай его, иначе, нет.
Для работы с регулярными выражениями, стандартная библиотека Ruby имеет в своем арсенале класс Regexp
, а также методы определенные других классах.
Примеры
Перед нами уже стояла задача, когда нам необходимо было сравнить строку на наличие определенных символов, но иногда стандартных методов бывает недостаточно, и на помощь приходят регулярные выражения. Для начала давайте рассмотрим несколько простых примеров.
Начнем с поиска строк уже известным нам способом.
Здесь мы проверяем строку на наличие слова Маша
, результат, соответственно, возвращает нам true
:
'Маша и Гоша'.include?('Маша')
=> true
А в данном случае слово Саша
в нашей строке отсутствует — получаем результат false
'Маша и Гоша'.include?('Саша')
=> false
Теперь на этом же примере воспользуемся регулярным выражением, а именно задействуем метод match
, аргументом которого является искомое значение объятое слешами, т.е. /Гоша/
. Метод возвращает нам найденное значение в виде объекта класса MatchData
, а конкретнее имя 'Гоша' в закодированном виде:
'Маша и Гоша'.match(/Гоша/)
=> #<MatchData "\x83\xAE\xE8\xAO">
В случае же использования слова, которое строка не содержит мы получим nil
:
'Маша и Гоша'.match(/Каша/)
=> nil
Также мы можем воспользоваться более лаконичным методом =~
, который проделывает аналогичную работу:
'Маша и Гоша' =~ /Каша/
=> nil
Как говорится от перемены мест слагаемых сумма не меняется, так и здесь, мы можем поменять строку с регулярным выражением местами, метод также будет работать:
/Каша/ =~ 'Маша и Гоша'
=> nil
Подставляем корректное слово:
'Маша и Гоша' =~ /Гоша/
=> 7
И видим, что метод вернул нам 7
. Данное число означает позицию (номер символа) в строке, где впервые было встречено совпадение (искомое условие). Давайте проверим, верен ли результат:
'Маша и Гоша'.index('Гоша')
=> 7
Как мы видим, результаты совпадают. Отлично, двигаемся дальше.
Мы можем задавать более сложные конструкции, например нам необходимо найти все числа, или же пропустить только те данные, которые соответствуют регулярному выражению (зачастую Вам придется использовать данный подход при проверке email).
Рассмотрим следующий пример:
'cat' =~ /c.t/
=> 0
Точка в регулярном выражении означает, что на ее месте возможен любой единственный символ, будь то ОДНО число, ОДНА буква или иной символ:
'cute' =~ /c.t/
=> 0
'scute' =~ /c.t/
=> 1
'caat' =~ /c.t/
=> nil
В последнем примере из-за использования нескольких символов на месте точки вместо одного — мы получили nil
. [\w\d]+@[\w\d]+\.[\w]+/ =~ '[email protected]'`
=> 0
где
\w
— аналогично выражению [a-zA-Z]
, то есть любая буква английского алфавита, независимая от case, но помимо этого также допускается наличие знака нижнего подчеркивания _
, что в общем то нам и требуется для проверки email, поскольку данный символ в адресе электронной почты допустим
\d
— аналогично выражению [0-9]
, то есть проверяет строку на наличие любых чисел
Мы научились искать и фильтровать информацию с помощью регулярных выражений, а теперь давайте шагнем еще дальше, и научимся преобразовывать отфильтрованную информацию. Мы можем применить метод gsub
, который в качестве параметров принимает само регулярное выражение, а также строку которая заменит найденное значение. Рассмотрим пример:
'I have an old car'.gsub('an old', 'a new')
=> "I have a new car"
'I have no money'. gsub(/no/, 'a heap of')
=> "I have a heap of money"
'I have a new car'.gsub(/a/, '1')
=> "I h2ve 1 new c1r"
Создаем игру «Угадай слово»
Начнем с постановки задачи. Условия игры следующие:
Игрок видит определенный набор букв со звездочкой, и вместо звездочки ему необходимо подставить букву так, чтобы получилось существующее слово. Кроме того перед набором букв и после набора могут быть любые другие буквы в любом количестве. Человеку необходимо придумать как можно больше слов подходящих под представленный игрой шаблон. Для наглядности рассмотрим изображение:
Кроме проверки соответствия шаблону, мы также будем проверять существует ли введенное пользователем слово в природе. А поможет нам в этом Wiktionary — Wiki-словарь.
Весь код с подробнейшими комментариями скачиваем в материалах к уроку.
Когда стоит применять регулярные выражения
Один из основных моментов, о котором всегда стоит помнить хорошему программисту — код должен быть легко читаемым. Некоторые регулярные выражения могут быть достаточно хитрыми, и не каждый разработчик сможет сходу разобраться, что сие выражение означает. Поэтому, если в определенной ситуации можно обойтись стандартными методами при решении задачи, то лучше воспользоваться ими. Не стоит усложнять себе и своим коллегам жизнь.
В целом, регулярные выражения являются крайне полезным и мощным инструментом. Вы как Ruby — разработчик не обязаны быть мастером регулярных выражений, однако разбираться в них все же не будет лишним.
Также вы будете лучше понимать, в какой ситуации стоить применять тот или иной паттерн.
Почему регулярные выражения так противоречивы?
При изучении регулярных выражений (иначе известных как RegEx-es) есть много людей, которые, кажется, видят регулярные выражения как священный Grail. Что — то, что выглядит таким сложным-просто должно быть ответом на любой вопрос. Они склонны думать, что любая проблема разрешима с помощью регулярных выражений.
С другой стороны, есть также много людей, которые пытаются избежать регулярных выражений любой ценой. Они пытаются найти способ обойти регулярные выражения и принять дополнительное кодирование только ради него, даже если регулярные выражения были бы более компактным решением.
Почему регулярные выражения считаются столь спорными? Существует ли широко распространенное непонимание того, как они работают? Или это может быть широкое убеждение, что регулярные выражения, как правило, медленные?
regex
Поделиться
Источник
Gumbo
18 апреля 2009 в 21:33
22 ответа
136
Я думаю, что люди возражают против регулярных выражений не потому, что они медленные, а скорее потому, что их трудно читать и писать, а также сложно правильно понять. Хотя есть некоторые ситуации, когда регулярные выражения обеспечивают эффективное и компактное решение проблемы, они иногда включаются в ситуации, когда вместо этого лучше использовать easy-to-read, поддерживаемый раздел кода.
Поделиться
Kyle Cronin
18 апреля 2009 в 21:37
122
Создание Ремонтопригодных Регулярных Выражений
Основным шагом к демистификации паттернов, ранее называемых “regular expressions”, является флаг Perl /x
regex — иногда пишется (?x)
при внедрении, — который позволяет whitespace (разрыв строки, отступ) и комментарии. Это серьезно улучшает читабельность и, следовательно, ремонтопригодность. Пустое пространство допускает когнитивное разделение, так что вы можете видеть, какие группы с чем.
Современные шаблоны также теперь поддерживают как относительно нумерованные, так и именованные обратные ссылки. Это означает, что вам больше не нужно считать группы захвата, чтобы выяснить, что вам нужно $4
или \7
. Это помогает при создании шаблонов, которые могут быть включены в другие шаблоны.
Вот пример относительно пронумерованной группы захвата:
$dupword = qr{ \b (?: ( \w+ ) (?: \s+ \g{-1} )+ ) \b }xi; $quoted = qr{ ( ["'] ) $dupword \1 }x;
А вот пример превосходного подхода именованных захватов:
$dupword = qr{ \b (?: (?<word> \w+ ) (?: \s+ \k<word> )+ ) \b }xi;
$quoted = qr{ (?<quote> ["'] ) $dupword \g{quote} }x;
Грамматические Регулярные Выражения
Лучше всего, эти именованные захваты могут быть помещены в блок (?(DEFINE)...)
, так что вы можете отделить объявление от выполнения отдельных именованных элементов ваших шаблонов. Это заставляет их действовать скорее как подпрограммы внутри шаблона.
Хороший пример такого рода “grammatical regex” можно найти в этом ответе и в этом . Они больше похожи на грамматическую декларацию.
Как последнее напоминает вам:
… убедитесь, что никогда не пишете шаблоны линейного шума. Ты не обязан и не должен. Ни один язык программирования не может быть обслуживаемым, который запрещает пробелы, комментарии, подпрограммы или буквенно-цифровые идентификаторы. Поэтому используйте все эти вещи в своих паттернах.
Это невозможно переоценить. Конечно, если вы не используете эти вещи в своих моделях, вы часто создаете кошмар. Но если вы их используете, то в этом нет необходимости.
Вот еще один пример современного грамматического паттерна, на этот раз для разбора RFC 5322:
использовать 5.10.0;
$rfc5322 = qr{
(?(DEFINE)
(?<address> (?&mailbox) | (?&group))
(?<mailbox> (?&name_addr) | (?&addr_spec))
(?<name_addr> (?&display_name)? (?&angle_addr))
(?<angle_addr> (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
(?<group> (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ; (?&CFWS)?)
(?<display_name> (?&phrase))
(?<mailbox_list> (?&mailbox) (?: , (?&mailbox))*)
(?<addr_spec> (?&local_part) \@ (?&domain))
(?<local_part> (?&dot_atom) | (?"ed_string))
(?<domain> (?&dot_atom) | (?&domain_literal))
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
\] (?&CFWS)?)
(?<dcontent> (?&dtext) | (?"ed_pair))
(?<dtext> (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])
(?<atext> (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
(?<atom> (?&CFWS)? (?&atext)+ (?&CFWS)?)
(?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
(?<dot_atom_text> (?&atext)+ (?: \. (?&atext)+)*)
(?<text> [\x01-\x09\x0b\x0c\x0e-\x7f])
(?<quoted_pair> \\ (?&text))
(?<qtext> (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
(?<qcontent> (?&qtext) | (?"ed_pair))
(?<quoted_string> (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?)
(?<word> (?&atom) | (?"ed_string))
(?<phrase> (?&word)+)
# Folding white space
(?<FWS> (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
(?<ctext> (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
(?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment))
(?<comment> \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
(?<CFWS> (?: (?&FWS)? (?&comment))*
(?: (?:(?&FWS)? (?&comment)) | (?&FWS)))
# No whitespace control
(?<NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])
(?<ALPHA> [A-Za-z])
(?<DIGIT> [0-9])
(?<CRLF> \x0d \x0a)
(?<DQUOTE> ")
(?<WSP> [\x20\x09])
)
(?&address)
}x;
Разве это не замечательно-и великолепно? Вы можете взять BNF-style grammar и перевести его непосредственно в код, не теряя его фундаментальной структуры!
Если вам все еще недостаточно современных грамматических шаблонов, то блестящий модуль Damian Conway Regexp::Grammars
предлагает еще более чистый синтаксис с превосходной отладкой. Вот тот же самый код для разбора RFC 5322, переделанный в шаблон из этого модуля:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper "Dumper";
my $rfc5322 = do {
use Regexp::Grammars; # ...the magic is lexically scoped
qr{
# Keep the big stick handy, just in case...
# <debug:on>
# Match this...
<address>
# As defined by these...
<token: address> <mailbox> | <group>
<token: mailbox> <name_addr> | <addr_spec>
<token: name_addr> <display_name>? <angle_addr>
<token: angle_addr> <CFWS>? \< <addr_spec> \> <CFWS>?
<token: group> <display_name> : (?:<mailbox_list> | <CFWS>)? ; <CFWS>?
<token: display_name> <phrase>
<token: mailbox_list> <[mailbox]> ** (,)
<token: addr_spec> <local_part> \@ <domain>
<token: local_part> <dot_atom> | <quoted_string>
<token: domain> <dot_atom> | <domain_literal>
<token: domain_literal> <CFWS>? \[ (?: <FWS>? <[dcontent]>)* <FWS>?
<token: dcontent> <dtext> | <quoted_pair>
<token: dtext> <. _`{|}~]
<token: atom> <.CFWS>? <.atext>+ <.CFWS>?
<token: dot_atom> <.CFWS>? <.dot_atom_text> <.CFWS>?
<token: dot_atom> <.CFWS>? <.dot_atom_text> <.CFWS>?
<token: dot_atom_text> <.atext>+ (?: \. <.atext>+)*
<token: text> [\x01-\x09\x0b\x0c\x0e-\x7f]
<token: quoted_pair> \\ <.text>
<token: qtext> <.NO_WS_CTL> | [\x21\x23-\x5b\x5d-\x7e]
<token: qcontent> <.qtext> | <.quoted_pair>
<token: quoted_string> <.CFWS>? <.DQUOTE> (?:<.FWS>? <.qcontent>)*
<.FWS>? <.DQUOTE> <.CFWS>?
<token: word> <.atom> | <.quoted_string>
<token: phrase> <.word>+
# Folding white space
<token: FWS> (?: <.WSP>* <.CRLF>)? <. WSP>+
<token: ctext> <.NO_WS_CTL> | [\x21-\x27\x2a-\x5b\x5d-\x7e]
<token: ccontent> <.ctext> | <.quoted_pair> | <.comment>
<token: comment> \( (?: <.FWS>? <.ccontent>)* <.FWS>? \)
<token: CFWS> (?: <.FWS>? <.comment>)*
(?: (?:<.FWS>? <.comment>) | <.FWS>)
# No whitespace control
<token: NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f]
<token: ALPHA> [A-Za-z]
<token: DIGIT> [0-9]
<token: CRLF> \x0d \x0a
<token: DQUOTE> "
<token: WSP> [\x20\x09]
}x;
};
while (my $input = <>) {
if ($input =~ $rfc5322) {
say Dumper \%/; # ...the parse tree of any successful match
# appears in this punctuation variable
}
}
В MAN-странице perlre есть много хорошего, но эти драматические улучшения фундаментальных конструктивных особенностей regex ни в коем случае не ограничиваются только Perl. Действительно , Man -страница pcrepattern может быть более легкой для чтения и охватывает ту же территорию.
Современные паттерны не имеют почти ничего общего с примитивными вещами, которым вас учили в классе конечных автоматов.
Поделиться
Joel Berger
29 октября 2010 в 15:44
68
Регулярные выражения-отличный инструмент, но люди думают: «Эй, какой отличный инструмент, я буду использовать его, чтобы сделать X!», где X-это то, для чего лучше использовать другой инструмент (обычно парсер). Это стандартное использование молотка там, где вам нужна проблема с отверткой.
Поделиться
Chas. Owens
18 апреля 2009 в 21:40
- Регулярные выражения для HTML
Я пытаюсь найти следующие регулярные выражения для реализации в моей программе для анализа данного файла html. Не могли бы вы помочь мне с чем-нибудь из этого? <div> <div class=”menuItem”> <span> class=”emph” Any string beginning with < and ending with >, i.e. all tags. The…
- Регулярные выражения-что определяет приоритет условного выражения?
Я хотел бы понять, как регулярные выражения определяют приоритет конкретного условия. Возьмите следующие строковые очки и регулярные выражения ниже. Пример 1 (\b\w+?)(?=(?:es)\b) Спичка сделана на стекле . Пример 2 (\b\w+?)(?=(?:s)\b) Спичка сделана на Глассе . Пример 3 Объединение двух:…
53
Почти все, кого я знаю, кто регулярно использует регулярные выражения (каламбур), происходят из среды Unix-иш, где они используют инструменты, которые рассматривают REs как первоклассные программные конструкции, такие как grep, sed, awk и Perl. Поскольку почти нет синтаксических накладных расходов на использование регулярного выражения, их производительность значительно возрастает, когда они это делают.
Напротив, программисты, использующие языки, в которых REs является внешней библиотекой, как правило, не рассматривают, что регулярные выражения могут принести в таблицу. Программист «time-cost» настолько высок, что либо а) REs никогда не появлялся как часть их обучения, либо б) они не «think» в терминах REs и предпочитают возвращаться к более знакомым шаблонам.
Поделиться
Barry Brown
19 апреля 2009 в 02:03
44
Регулярные выражения позволяют компактно написать пользовательский конечный автомат (FSM) для обработки строки входных данных. Есть по крайней мере две причины, по которым использование регулярных выражений трудно:
Разработка программного обеспечения старой школы включает в себя много планирования, бумажных моделей и тщательного обдумывания. Регулярные выражения очень хорошо вписываются в эту модель, потому что для правильного написания эффективного выражения требуется много смотреть на него, визуализируя пути FSM.
Современные разработчики программного обеспечения предпочли бы выковывать код и использовать отладчик для пошагового выполнения, чтобы проверить правильность кода. Регулярные выражения не очень хорошо поддерживают этот стиль работы. Один «run» регулярного выражения фактически является атомарной операцией. Трудно наблюдать пошаговое выполнение в отладчике.
Слишком легко написать регулярное выражение, которое случайно принимает больше входных данных, чем вы намереваетесь. Значение регулярного выражения на самом деле не должно соответствовать допустимому входу, оно должно не соответствовать недопустимому входу . Методы выполнения «negative tests» для регулярных выражений не очень продвинуты или, по крайней мере, не широко используются.
Это приводит к тому, что регулярные выражения трудно читать. Просто глядя на регулярное выражение, требуется большая концентрация, чтобы визуализировать все возможные входные данные, которые должны быть отклонены, но ошибочно приняты. Вы когда-нибудь пытались отладить чей- то код регулярного выражения?
Если сегодня среди разработчиков программного обеспечения существует сопротивление использованию регулярных выражений, я думаю, что это в основном связано с этими двумя факторами.
Поделиться
Bill Karwin
18 апреля 2009 в 22:19
37
Люди склонны думать, что регулярные выражения трудны, но это потому, что они используют их неправильно. Написание сложных однострочных текстов без каких-либо комментариев, отступов или именованных захватов. (Вы же не втискиваете свое сложное выражение SQL в одну строку, без комментариев, отступов или псевдонимов, не так ли?). Так что да, для многих людей они не имеют смысла.
Однако, если ваша работа имеет какое- то отношение к разбору текста (примерно любое веб-приложение там…), и вы не знаете регулярных выражений, вы отстой в своей работе, и вы тратите свое собственное время и время своего работодателя. Там есть отличные ресурсы , чтобы научить вас всему, что вам когда-либо понадобится знать, и даже больше.
Поделиться
Jasper Bekkers
18 апреля 2009 в 22:06
28
Потому что у них нет самого популярного инструмента обучения в общепринятом IDEs: нет мастера Regex. Даже не Автозавершение. Вы должны кодировать все это сами.
Поделиться
dkretz
18 апреля 2009 в 22:25
Поделиться
Anthony
18 апреля 2009 в 21:35
16
Я не думаю, что они настолько противоречивы.
Я также думаю, что вы как бы ответили на свой собственный вопрос, потому что вы указываете, как глупо было бы использовать их везде ( не все является обычным языком 2 ) или вообще избегать их использования. Вы, программист, должны принять разумное решение о том, когда регулярные выражения помогут коду или навредят ему. Сталкиваясь с таким решением, следует иметь в виду две важные вещи: ремонтопригодность (что подразумевает читабельность) и расширяемость.
Для тех, кто особенно не любит их, я думаю, что они никогда не научились использовать их должным образом. Я думаю, что большинство людей, которые проводят всего несколько часов с приличным учебником, поймут их и очень быстро станут беглыми. Вот мое предложение о том, с чего начать:
http://docs.python.org/методические указания/regex
Хотя на этой странице говорится о регулярных выражениях в контексте Python, я обнаружил, что эта информация очень применима в других местах. Есть несколько вещей, которые специфичны для Python, но я считаю, что они четко отмечены и легко запоминаются.
Поделиться
allyourcode
18 апреля 2009 в 22:09
11
Регулярные выражения для строк-то же самое, что арифметические операторы для чисел, и я бы не считал их спорными. Я думаю, что даже такой довольно воинствующий активист, как я (который склонен выбирать другие объекты вместо струн), будет трудно отказаться от них.
Поделиться
CurtainDog
19 апреля 2009 в 11:52
7
Проблема в том, что регулярные выражения потенциально настолько мощны, что вы можете делать с ними вещи, для которых вам следует использовать что-то другое.
Хороший программист должен знать, где их использовать, а где нет. Типичным примером является синтаксический анализ нерегулярных языков (см. раздел определение того, является ли язык регулярным ).
Я думаю, что вы не ошибетесь, если сначала ограничитесь реальными регулярными выражениями (без расширений). Некоторые расширения могут сделать вашу жизнь немного проще, но если вы обнаружите, что что-то трудно выразить как реальный regex, это вполне может быть признаком того, что regex не является правильным инструментом.
Поделиться
Svante
18 апреля 2009 в 22:17
5
С таким же успехом вы можете спросить о том, почему Гото спорны.
В принципе, когда вы получаете так много власти «obvious», люди apt злоупотребляют ими в ситуациях, для которых они не являются лучшим вариантом. Например, меня поражает количество людей, которые просят разобрать CSVs, XML или HTML в регулярных выражениях. Это неподходящий инструмент для работы. Но некоторые пользователи все равно настаивают на использовании регулярных выражений.
Лично я стараюсь найти эту счастливую среду-использовать регулярные выражения для того, для чего они хороши, и избегать их, когда они менее оптимальны.
Обратите внимание, что регулярные выражения все еще можно использовать для анализа CSVs, XML, HTML и т. д. Но, как правило, не в одном regex.
Поделиться
Tanktalus
18 апреля 2009 в 21:42
4
Это интересная тема.
Многие любители регулярных выражений, похоже, путают лаконичность формулы с эффективностью.
Кроме того, регулярное выражение, требующее много размышлений, приносит своему автору огромное удовлетворение, которое сразу же делает его законным.
Но… регулярные выражения так удобны, когда производительность не является проблемой и вам нужно быстро справиться с выводом текста, например в Perl. Кроме того, хотя производительность является проблемой, можно предпочесть не пытаться превзойти библиотеку регулярных выражений с помощью самодельного алгоритма, который может быть глючным или менее эффективным.
Кроме того, существует ряд причин, по которым регулярные выражения несправедливо критикуются, например
- регулярное выражение не эффективно, потому что построение Верхнего не очевидно
- некоторые программисты «forget» компилируют только один раз регулярное выражение, которое будет использоваться много раз (например, Статический шаблон в Java)
- некоторые программисты идут на стратегию проб и ошибок — еще меньше работает с регулярными выражениями!
Поделиться
e2-e4
24 августа 2010 в 19:07
4
То, что я думаю, что изучение Regex и поддержание regex делает непопулярным,
большинство разработчиков ленивы или большинство из них полагаются на внешние библиотеки, чтобы сделать разбор для них. .. они полагаются на google для ответа и даже спрашивают на форумах полный код для своей проблемы.
Но когда дело доходит до реализации или модификации/поддержания regex, они просто терпят неудачу.
Есть популярная поговорка «Friends dont let Friends use Regex for Parsing HTML»
Но что касается меня, то я сделал полные Парсеры HTML, используя Regex, и я нахожу, что regex лучше разбирают строки html как по скорости, так и по памяти(если у вас есть идея, чего вы хотите достичь 🙂 )
Поделиться
Rajeev
31 марта 2011 в 10:18
4
Я не думаю, что 32-это правильное слово.
Но я видел массу примеров, когда люди говорили: «какое регулярное выражение мне нужно сделать such-and-such манипуляцией со строкой?» которые являются X-Y проблемами.
Другими словами, они исходили из предположения, что regex-это то, что им нужно, но им было бы лучше с split(), переводом, подобным perl-му tr///, где символы заменяются один на другой, или просто index().
Поделиться
AmbroseChapel
19 апреля 2009 в 09:59
2
Регулярные выражения являются серьезной загадкой для многих людей, в том числе и для меня. Это прекрасно работает, но это все равно что смотреть на математическое уравнение. Однако я рад сообщить, что кто-то наконец-то создал консолидированное расположение различных функций регулярных выражений в http://regexlib.com/ . Теперь, если бы Microsoft только создала класс регулярных выражений, который автоматически выполнял бы большую часть обычных вещей, таких как удаление букв или фильтрация дат.
Поделиться
Al Katawazi
18 апреля 2009 в 21:48
1
Иногда я нахожу регулярные выражения бесценными. Когда мне нужно сделать несколько поисков «fuzzy» и, возможно, заменить. Когда данные могут варьироваться и иметь определенную случайность.
Однако когда мне нужно выполнить простой поиск и замену или проверить строку, я не использую регулярные выражения. Хотя я знаю многих людей, которые это делают, они используют его для всего. В этом и заключается противоречие.
Если вы хотите вставить гвоздь в стену, не используйте молоток. Да, это сработает, но к тому времени, как вы получите молоток, я смогу вбить в стену 20 гвоздей.
Регулярные выражения должны использоваться для того, для чего они были разработаны, и не меньше.
Поделиться
Brent Baisley
19 апреля 2009 в 02:25
0
Я думаю, что это менее известная техника среди программистов. Таким образом, это не имеет широкого признания. И если у вас есть нетехнический менеджер, чтобы просмотреть ваш код или просмотреть вашу работу, то регулярное выражение очень плохо. Вы потратите часы на написание идеального регулярного выражения и получите несколько баллов за модуль, думая, что он написал так мало строк кода.
Кроме того, как уже говорилось в другом месте, чтение регулярных выражений-очень сложная задача.
Поделиться
Satya Prakash
24 августа 2010 в 18:23
0
Приличные системы регулярных выражений, такие как используемые в lex и yacc для определения компилятора, хороши, очень полезны и чисты. В этих системах типы выражений определяются в терминах других. Это отвратительные искаженные нечитаемые линейные шумовые гигантские однострочные регулярные выражения, обычно встречающиеся в коде perl и sed (и т. д.), которые являются ‘controversial’ (мусором).
Поделиться
Sam Watkins
08 ноября 2010 в 06:55
0
В некоторых случаях я думаю, что вы можете использовать их. Например, построить лексер.
На мой взгляд, это точка зрения людей, которые могут писать регулярные выражения, и людей, которые этого не делают (или почти не делают).
Я лично думаю, что это хорошая мысль, например, для проверки ввода формы, будь то в javascript, чтобы предупредить пользователя, или на серверном языке.
Поделиться
Aif
27 февраля 2010 в 11:15
0
Хотя я думаю, что регулярные выражения являются важным инструментом, самое раздражающее в них то, что существуют различные реализации. Небольшие различия в синтаксисе, модификаторах и — особенно-«greed» могут сделать вещи действительно хаотичными, требуя trial-and-error и иногда порождая загадочные ошибки.
Поделиться
ndr
19 апреля 2009 в 01:02
-4
Лучшее допустимое и нормальное использование для regex — это проверка формата адреса email.
Это хорошее его применение.
Я использовал регулярные выражения бесчисленное количество раз в качестве одноразовых в TextPad для массажа плоских файлов, создания csv файлов, создания SQL операторов вставки и тому подобного.
Хорошо написанные регулярные выражения не должны быть слишком медленными. Обычно альтернативы, такие как тонны вызовов на замену, являются гораздо более медленными вариантами. С таким же успехом можно сделать это за один проход.
Многие ситуации требуют именно регулярных выражений и ничего больше.
Замена специальных непечатаемых символов безобидными символами — еще одно хорошее применение.
Я, конечно, могу себе представить, что есть некоторые кодовые базы, которые чрезмерно используют регулярные выражения в ущерб ремонтопригодности. Сам я такого никогда не видел. На самом деле меня избегали рецензенты кода за то, что я недостаточно использовал регулярные выражения.
Поделиться
Chris Morley
19 апреля 2009 в 02:39
Похожие вопросы:
Lua string.match использует нерегулярные регулярные выражения?
Мне любопытно, почему это не работает, и мне нужно знать, почему/как обойти это; я пытаюсь определить, является ли какой-то вход вопросом, я почти уверен, что string. match — это то, что мне нужно,…
Генеративные регулярные выражения
Обычно в нашей работе мы используем регулярные выражения в операциях захвата или сопоставления . Однако регулярные выражения можно использовать — по крайней мере, вручную-для создания юридических…
Регулярные выражения и Assembly
Я знаю 8086 Assembly и учусь MIPS Assembly. Кроме того, я изучаю регулярные выражения, тогда я хочу знать: Как я могу использовать на них регулярные выражения?
Почему регулярные выражения называются «regular» выражениями?
Почему регулярные выражения называются регулярными выражениями?
Почему Silverlight не поддерживает скомпилированные регулярные выражения?
Бета-фреймворки Silverlight 2 и Silverlight 3 не поддерживают скомпилированные регулярные выражения, т. е.: RegexOptions.Compiled Мне было бы интересно услышать рассуждения о том, почему это так,…
Регулярные выражения для HTML
Я пытаюсь найти следующие регулярные выражения для реализации в моей программе для анализа данного файла html. Не могли бы вы помочь мне с чем-нибудь из этого? <div> <div…
Регулярные выражения-что определяет приоритет условного выражения?
Я хотел бы понять, как регулярные выражения определяют приоритет конкретного условия. Возьмите следующие строковые очки и регулярные выражения ниже. Пример 1 (\b\w+?)(?=(?:es)\b) Спичка сделана на…
Почему эти регулярные выражения выполняются медленно в Java?
Я пытаюсь использовать регулярные выражения, чтобы определить, какой формат применил пользователь при вводе входных данных в textbox. Регулярные выражения выглядят следующим образом: (\\s?[ +…
Являются ли регулярные выражения (regex) действительно регулярными?
Я понимаю, как регулярные выражения получили свое название, и прочитал связанный с этим вопрос ( почему регулярные выражения называются «regular» выражениями? ), но мне все еще интересно,…
Измените регулярные выражения vim
Есть ли способ изменить регулярные выражения vim’ на регулярные выражения python’? Я хотел бы работать с регулярными выражениями python в моем vim.
Что такое регулярное выражение (регулярное выражение)?
Обновлено: 31.12.2020, Computer Hope
Сокращение от регулярного выражения , регулярное выражение — это строка текста, которая позволяет создавать шаблоны, которые помогают сопоставлять, находить и управлять текстом. Perl — отличный пример языка программирования, использующего регулярные выражения. Однако это только одно из многих мест, где можно найти регулярные выражения. Регулярные выражения также можно использовать из командной строки и в текстовых редакторах для поиска текста в файле.
Когда впервые пытаешься понять регулярные выражения, кажется, что это другой язык. Однако освоение регулярных выражений может сэкономить вам тысячи часов, если вы работаете с текстом или вам нужно проанализировать большие объемы данных. Ниже приведен пример регулярного выражения с пометкой каждого из его компонентов. Это регулярное выражение также показано в примерах программирования на Perl, показанных далее на этой странице.
Основы регулярных выражений (шпаргалка)
Приведенный выше пример может показаться ошеломляющим.abc
Флаги регулярных выражений
За пределами регулярного выражения (в конце) флаги помогают в сопоставлении с образцом.
Персонаж | Что он делает? |
---|---|
я | Игнорировать регистр (разрешены прописные и строчные буквы). |
м | Многострочный матч. |
с | Совместите новые строки. |
x | Разрешить пробелы и комментарии. |
Дж | Разрешены повторяющиеся имена групп. |
U | Нежирный матч. |
Примеры регулярных выражений языка программирования Perl
Ниже приведены несколько примеров регулярных выражений и сопоставления с образцом в Perl.Многие из этих примеров похожи или аналогичны другим языкам программирования и программам, поддерживающим регулярные выражения.
$ data = ~ s / bad data / good data / i;
В приведенном выше примере любые «неверные данные» заменяются «хорошими данными» с использованием соответствия без учета регистра. Итак, если бы переменная $ data была «Вот плохие данные», она стала бы «Вот хорошие данные».
$ data = ~ s / a / A /;
В этом примере любая строчная a заменяется на прописную A . Итак, если $ data был «example», он стал бы «exAmple».
$ data = ~ s / [a-z] / * /;
В приведенном выше примере любая строчная буква от a до z заменяется звездочкой. Итак, если $ data был «Примером», он стал бы «E ******».
$ data = ~ s / e $ / es /;
В этом примере используется символ $, который указывает регулярному выражению соответствовать тексту перед ним в конце строки. Итак, если бы $ data был «примером», он стал бы «примерами».
$ data = ~ s /\./!/;
В приведенном выше примере мы заменяем точку восклицательным знаком.) указывает регулярному выражению соответствовать чему-либо в начале строки. В этом примере любая строчная буква «е» в начале строки заменяется заглавной «е». Следовательно, если $ data был «примером», он стал бы «примером».
Компьютерные сокращения, escape-последовательность, выражение, глобус, метасимвол, термины программирования, тильда, подстановочный знак
RegexBuddy упрощает регулярные выраженияЯ знаю. Регулярное выражение для соответствия любому адресу электронной почты выглядит довольно устрашающе. Но RegexBuddy делает синтаксис регулярных выражений кристально чистым. Если в вашем браузере включен JavaScript, при наведении указателя мыши на регулярное выражение ниже или в описании будут выделены соответствующие части. RegexBuddy делает то же самое, когда вы создаете регулярное выражение или анализируете регулярное выражение, написанное кем-то другим. Немного попрактиковавшись и с помощью RegexBuddy, вы скоро научитесь создавать регулярные выражения. Да, и вам определенно не нужно быть программистом, чтобы пользоваться регулярными выражениями! (Читайте ниже.) \ b [A-Z0-9 ._% + -] ++ @ [A-Z0-9 .-] + \. [AZ] {2,6} \ b
Экономия времени и Усилия с регулярными выражениями
Позвольте RegexBuddy сделать регулярное выражение простым для вас |
Сначала используйте RegexBuddy, чтобы определить регулярное выражение или получить регулярное выражение, сохраненное в библиотеке RegexBuddy. Положитесь на четкий анализ регулярных выражений RegexBuddy, который постоянно обновляется по мере построения шаблона, вместо того, чтобы разбираться с загадочным синтаксисом регулярных выражений самостоятельно.Подробная справка по этому синтаксису всегда находится на расстоянии одного клика. Если вы скопировали регулярное выражение, написанное для другого языка программирования, просто вставьте его в RegexBuddy, выберите исходный язык и затем преобразуйте регулярное выражение в VBscript. Если вы создали новое регулярное выражение, проверьте и отладьте его в RegexBuddy, прежде чем использовать его в исходном коде VBScript. Проверьте каждое регулярное выражение в безопасной песочнице RegexBuddy, не рискуя ценными данными. Быстро примените регулярное выражение к широкому спектру входных и выборочных данных, не создавая эти входные данные с помощью сценария. Наконец, позвольте RegexBuddy сгенерировать фрагмент исходного кода, который вы можете скопировать и вставить непосредственно в любую IDE или редактор кода, который вы используете. Просто выберите, для чего вы хотите использовать регулярное выражение, и полностью функциональный фрагмент кода готов. Вы можете изменить имена переменных и параметров в соответствии с вашим стилем именования или текущей ситуацией, которую RegexBuddy автоматически запоминает. Не пытайтесь запомнить специфический синтаксис регулярных выражений VBScript. Просто скажите RegexBuddy, что вы хотите сделать, и вы сразу получите правильный код VBScript.Можно сделать все, что угодно: проверить строку на соответствие, извлечь совпадения при поиске, проверить ввод, выполнить поиск и заменить, разбить строку и т. Д. Пусть RegexBuddy делает Regex простым для вас | «Я должен сказать, что RegexBuddy — бесценный инструмент. Это, безусловно, лучший инструмент для работы с регулярными выражениями, который я когда-либо использовал. Раньше я тратил время на отладку регулярных выражений Perl, используя тонны простых операторов print. Все это ушло, и теперь я определенно лучше понимаю более сложные функции регулярных выражений благодаря этому инструменту. «Лучшая часть RegexBuddy — это то, что я могу ввести регулярное выражение, написанное на Perl, и легко преобразовать его на другой язык. Иногда единственный вариант, который у меня есть, — это использовать VBScript, и возможность быстро и легко преобразовать мое регулярное выражение Perl в VBScript значительно экономит время. «Мне также нравится функция« Комментировать с деревом регулярных выражений RegexBuddy ». Добавление этого объяснения регулярного выражения в мой код действительно помогает непосвященным понять, что я сделал, и упрощает поддержку моего кода. |
1.Что такое регулярное выражение?
Регулярные выражения — это специально закодированные текстовые строки, используемые как
шаблоны для сопоставления наборов строк. Они начали появляться в 1940-х годах как
способ описания обычных языков, но они действительно начали появляться в
мир программирования в 1970-е годы. Первый
Я мог найти их в текстовом редакторе QED, написанном Кеном Томпсоном.
«Регулярное выражение — это шаблон, который определяет набор строк.
персонажей; говорят, что он соответствует определенным строкам.”—Кен Томпсон
Регулярные выражения позже стали важной частью набора инструментов.
который появился в операционной системе Unix — ed ,
sed и vi
( vim ) редакторы, grep ,
AWK и другие. Но способы, которыми регулярно
Реализованные выражения не всегда были такими регулярными.
Примечание
В этой книге используется индуктивный подход; другими словами, он движется из
частное к общему.Так что, а не пример из трактата,
вы часто получаете сначала пример, а затем краткий трактат, следующий за
который. Это книга для практических занятий.
Регулярные выражения имеют репутацию грубых, но это все
зависит от того, как вы к ним подходите. Это естественный прогресс от
что-то настолько простое, как это:
\ d
сокращенное обозначение символов , которое соответствует любой цифре от 0 до 9, к чему-то немного большему
сложный, например:
^ (\ (\ d {3} \) | ^ \ d {3} [. -]?)? \ d {3} [.-]? \ d {4} $
, на котором мы закончим в конце этой главы: довольно
надежное регулярное выражение, соответствующее 10-значному телефону в Северной Америке
номер с круглыми скобками вокруг кода города или без них, с или без
дефисы или точки (точки) для разделения чисел. (Скобки должны быть
уравновешенный тоже; другими словами, у вас не может быть только один.)
Примечание
Глава 10 показывает вам немного более сложный
регулярное выражение для номера телефона, но приведенное выше достаточно для
цели этой главы.
Если вы еще не понимаете, как все это работает, не волнуйтесь: я объясню
все выражение понемногу в этой главе. Если вы просто будете следовать
примеры (и те, что во всей книге, если на то пошло), написание
регулярные выражения скоро станут для вас второй натурой. Готовы узнать
для себя?
Иногда я представляю символы Юникода в этой книге, используя их
кодовая точка — четырехзначное шестнадцатеричное (основание 16) число. Эти
кодовые точки отображаются в виде U + 0000 .U + 002E, для
Например, представляет собой кодовую точку для точки или точки (.).
Сначала позвольте познакомить вас с веб-сайтом Regexpal http://www.regexpal.com. Откройте сайт в браузере,
например, Google Chrome или Mozilla Firefox. Вы можете посмотреть, как выглядит сайт
как на рисунке 1-1.
Рисунок 1-1. Regexpal в браузере Google Chrome
Вы можете видеть, что есть текстовая область в верхней части и более крупная
текстовая область под ним. Верхнее текстовое поле предназначено для ввода обычного
выражения, а нижний содержит тему или целевой текст.В
целевой текст — это текст или набор строк, которые вы хотите сопоставить.
Примечание
В конце этой главы и каждой следующей главы вы найдете
раздел «Технические примечания». Эти примечания содержат дополнительную информацию
о технологии, обсуждаемой в этой главе, и расскажем, где ее получить
больше информации об этой технологии. Размещение этих заметок в конце
глав помогает сохранить поток основного текста.
вместо того, чтобы останавливаться, чтобы обсудить каждую деталь по пути.
Теперь мы сопоставим номер телефона в Северной Америке с регулярным выражением. Тип
телефонный номер, указанный здесь в нижней части Regexpal:
707-827-7019
Вы узнаете его? Это номер компании O’Reilly Media.
Сопоставим это число с регулярным выражением. Есть много
способов сделать это, но для начала просто введите сам номер в
верхний раздел, в точности как написано в нижнем разделе (подождите,
не вздыхайте):
707-827-7019
Вы должны увидеть номер телефона, который вы ввели в нижнем поле
выделены желтым от начала до конца.Если это то, что вы видите (как
показано на рисунке 1-2), значит, вы занимаетесь бизнесом.
Примечание
Когда я упоминаю цвета в этой книге, в связи с чем-то вы
может быть видно на изображении или снимке экрана, например выделение в
Regexpal, эти цвета могут появиться в Интернете и в электронных книгах.
книга, но, увы, не напечатанная. Итак, если вы читаете эту книгу на бумаге,
тогда, когда я упоминаю цвет, ваш мир будет оттенками серого, а мои
извинения.
Рисунок 1-2.Десятизначный номер телефона, выделенный в Regexpal
. В этом регулярном выражении вы использовали что-то
называется строковым литералом , чтобы соответствовать строке в целевом тексте. Строковый литерал — это
буквальное представление строки.
Теперь удалите номер в верхнем поле и замените его только на
номер 7 . Вы видели, что произошло? Теперь только
семерки выделены. Буквальный символ (число)
7 в регулярном выражении соответствует четырем
экземпляры числа 7 в совпадающем тексте.
Что, если вы хотите сопоставить все номера в телефонном номере сразу? Или же
сопоставить любое число в этом отношении?
Попробуйте сделать следующее, еще раз точно как показано в верхнем тексте
box:
[0-9]
Все числа (точнее цифр ) в
нижняя часть выделена попеременно желтым и синим цветом. Что за
регулярное выражение [0-9]
говорит
обработчик регулярных выражений: «Сопоставьте любую цифру в диапазоне от 0 до
9.”
Квадратные скобки не совпадают буквально, потому что они
обрабатываются специально как метасимволы . Метасимвол имеет
специальное значение в регулярных выражениях и зарезервировано. Обычный
выражение в форме [0-9]
равно
называется классом символов или иногда набором символов .
Можно более точно ограничить диапазон цифр и получить то же самое
результат, используя более конкретный список цифр для сопоставления, например
следующее:
[012789]
Это будет соответствовать только перечисленным цифрам, то есть 0, 1, 2, 7, 8,
и 9.Попробуйте в верхнем поле. Еще раз, каждая цифра в нижнем поле
будут выделены чередующимися цветами.
Для соответствия любому 10-значному номеру телефона в Северной Америке, части которого
разделенные дефисами, вы можете сделать следующее:
[0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] - [0-9] [ 0-9] [0-9] [0-9]
Это сработает, но напыщенно. Есть лучший способ с
то, что называется стенографией.
Еще один способ сопоставления цифр, который вы видели в начале
в главе \ d
, что само по себе будет соответствовать всем арабским цифрам, как и
[0-9]
.Попробуйте это в верхнем разделе и,
как и в случае с предыдущими регулярными выражениями, цифры ниже будут
выделено. Такое регулярное выражение называется
Сокращение символов . (Его также называют escape-символом , но этот
термин может вводить в заблуждение, поэтому я избегаю его. Я объясню
позже.)
Чтобы сопоставить любую цифру в номере телефона, вы также можете сделать
это:
\ d \ d \ d- \ d \ d \ d- \ d \ d \ d \ d
Повторение \ d
три и четыре
раз подряд будет точно соответствовать последовательности трех и четырех цифр.Дефис в приведенном выше регулярном выражении вводится как буквальный
символ и будет сопоставлен как таковой.
А как насчет дефисов? Как вы их сопоставите? Вы можете использовать
буквальный дефис (-), как уже показано, или вы можете использовать экранированный верхний регистр
D ( \ D
), который
соответствует любому символу, который равен , а не a
цифра.
В этом примере используется \ D
вместо
буквальный дефис.
\ d \ d \ d \ D \ d \ d \ d \ D \ d \ d \ d \ d
Еще раз, весь номер телефона, включая дефисы, должен
быть выделенным на этот раз.
Вы также можете сопоставить эти надоедливые дефисы с помощью точки (.):
\ d \ d \ d. \ D \ d \ d. \ D \ d \ d \ d
Точка или период, по сути, действуют как подстановочный знак и будет соответствовать любому
символ (кроме, в некоторых случаях, окончания строки). В примере
выше, регулярное выражение соответствует дефису, но может также соответствовать
знак процента (%):
707% 827% 7019
Или вертикальная черта (|):
707 | 827 | 7019
Или любой другой символ.
Примечание
Как я уже упоминал, точка (официально точка) будет
обычно не соответствует символу новой строки, например переводу строки (U + 000A).Однако есть способы сделать возможным сопоставление новой строки с символом
точка, которую я покажу вам позже. Это часто называют
dotall вариант.
Теперь вы сопоставите только часть номера телефона, используя то, что
известная как группа захвата . Затем вы обратитесь к
содержимое группы с обратной ссылкой . Чтобы создать захват
группу, заключите \ d
в пару
круглые скобки, чтобы поместить его в группу, а затем следовать за ним \ 1
для обратной ссылки на то, что было захвачено:
(\ d) \ d \ 1
\ 1
относится к тому, что было
записаны в группу, заключенную в круглые скобки.В результате это регулярное выражение соответствует
префикс 707
. Вот разбивка
это:
(\ d)
соответствует первой цифре
и фиксирует его (число 7 )\ d
соответствует следующей цифре
(номер 0 ), но не захватывает его, потому что он
не заключен в скобки\ 1
ссылается на захваченный
цифра (номер 7 )
Это будет соответствовать только коду города.Не волнуйтесь, если вы не полностью
поймите это прямо сейчас. Позже вы увидите множество примеров групп.
в книге.
Теперь вы можете сопоставить весь номер телефона с одной группой и
несколько обратных ссылок:
(\ d) 0 \ 1 \ D \ d \ d \ 1 \ D \ 1 \ d \ d \ d
Но это не так элегантно, как могло бы быть. Давай попробуем что-нибудь
это работает даже лучше.
Вот еще один способ сопоставить номер телефона с помощью другого
синтаксис:
\ d {3} -? \ d {3} -? \ d {4}
Числа в фигурных скобках говорят процессору регулярных выражений
ровно сколько вхождений этих цифр вы хотите
это искать.Фигурные скобки с числами — это своего рода квантификатор . Сами брекеты
считаются метасимволами.
Вопросительный знак (?
) стоит
другой вид квантификатора. Он следует за дефисом в
регулярное выражение выше и означает, что дефис не обязателен, т. е.
что может быть ноль или один дефис (один или ни одного).
Существуют и другие кванторы, такие как знак плюса ( +
), которые
означает «один или несколько» или звездочку ( *
), что означает «ноль или более».”
Используя кванторы, вы можете сделать регулярное выражение еще более эффективным.
краткий:
(\ d {3,4} [.-]?) +
Знак плюс снова означает, что количество может встречаться одно или несколько
раз. Это регулярное выражение будет соответствовать трем или четырем цифрам,
за которыми следует необязательный дефис или точка, сгруппированные в круглые скобки,
один или несколько раз ( +
).
Голова кружится? Надеюсь нет. Вот посимвольный
анализ регулярного выражения выше:
(
открыть захват
группа\
сокращение начального символа
(избегайте следующего символа)d
сокращенное обозначение конечного символа
(сопоставьте любую цифру в диапазоне от 0 до 9 с\ d
){
открытый квантор3
минимальное количество для
соответствие,
отдельные количества4
максимальное количество
соответствует}
квантификатор закрытия[
класс открытых символов.
точка или период (соответствует
буквальная точка)-
буквенный символ для соответствия
дефис]
закрывающий символ
класс?
ноль или один
квантификатор)
закрытый захват
группа+
один или несколько
квантификатор
Все это работает, но не совсем верно, потому что оно также будет соответствовать
другие группы из 3 или 4 цифр, будь то в форме номера телефона или
нет.Да, мы учимся на ошибках лучше, чем на успехах.
Так что давайте немного улучшим его:
(\ d {3} [.-]?) {2} \ d {4}
Это будет соответствовать двум последовательностям из трех цифр без скобок в каждой,
за которым следует необязательный дефис, а затем ровно четыре
цифры.
Наконец, вот регулярное выражение, которое позволяет буквальным скобкам
необязательно обернуть первую последовательность из трех цифр и сделать область
код также необязательный:
^ (\ (\ d {3} \) | ^ \ d {3} [. (каретка) в начале регулярного выражения или после
вертикальная черта ( |
) означает, что
номер телефона будет в начале строки.
(
открывает захват
группа.
\ (
- буквальное открытое
скобка.
\ d
соответствует цифре.
{3}
- это количественный показатель,
после \ d
соответствует ровно трем
цифры. совпадает с началом
линия.
\ d
соответствует цифре.
{3}
- количественный показатель
что соответствует ровно трем цифрам.
[.-]?
соответствует необязательной точке
или дефис.
)
закрытая группа захвата.
?
сделать группу необязательной, то есть префикс в группе не
требуется.
\ d
соответствует цифре.
{3}
соответствует ровно трем
цифры.
[.-]?
совпадает с другим
необязательная точка или дефис.
\ d
соответствует цифре.
{4}
соответствует ровно четырем
цифры.
$
соответствует концу строки.
Это последнее регулярное выражение соответствует 10-значному североамериканскому номер телефона в круглых скобках, дефисах или точках или без них.Пытаться различные формы числа, чтобы увидеть, что будет соответствовать (и что не будет).
Примечание
Группа захвата в приведенном выше регулярном выражении не является необходимо. Группа необходима, а захватывающая часть - нет. Там - лучший способ сделать это: группа без захвата. Когда мы вернемся к этому регулярное выражение в последней главе книги, вы поймете Почему.
В заключение этой главы я покажу вам регулярное выражение для номер телефона в нескольких приложениях.
TextMate - это редактор, который доступен только на Mac и использует тот же библиотека регулярных выражений как язык программирования Ruby. Вы можете использовать регулярные выражения с помощью функции поиска (поиска), как показано на рисунке 1-3. Установите флажок рядом с Regular выражение .
Рисунок 1-3. Регулярное выражение номера телефона в TextMate
Notepad ++ доступно в Windows и представляет собой популярный бесплатный редактор, использующий библиотека регулярных выражений PCRE. Вы можете получить к ним доступ через поиск и замените (рис. 1-4), установив переключатель рядом с to Регулярное выражение .
Рисунок 1-4. Регулярное выражение номера телефона в Notepad ++
Oxygen также является популярным и мощным редактором XML, который использует регулярное выражение Perl 5. синтаксис. Вы можете получить доступ к регулярным выражениям через поиск и заменить диалог, как показано на рисунке 1-5, или через его обычное построитель выражений для XML-схемы. Чтобы использовать регулярные выражения с Найти / заменить, поставить галочку напротив Regular выражение .
Рисунок 1-5. Регулярное выражение телефонного номера в Oxygen
На этом введение заканчивается.Поздравляю. Вы покрыли в этой главе много материала. В следующей главе мы сосредоточимся на простое сопоставление с образцом.
-
Что такое регулярное выражение
-
Как использовать Regexpal, простое регулярное выражение процессор
-
Как сопоставить строковые литералы
-
Как сопоставить цифры с классом символов
-
Как сопоставить цифру с сокращением символов
-
Как сопоставить не цифру с сокращением символов
-
Как использовать группу захвата и обратную ссылку
-
Как сопоставить точное количество в наборе строк
-
Как сопоставить символ (ноль или один) или один или несколько символов раз
-
Как сопоставить строки в начале или в конце линия
-
Regexpal (http: // www.regexpal.com) является веб-реализация регулярного выражения на основе JavaScript. Его не самая полная реализация, и она не все что могут делать регулярные выражения; однако это чистый, простой и очень простой в использовании инструмент обучения, и он предоставляет множество функций для вам, чтобы начать.
-
Вы можете загрузить браузер Chrome со страницы https://www.google.com/chrome или Firefox с http://www.mozilla.org/en-US/firefox/new/.
-
Почему существует так много способов делать что-то с регулярным выражения? Одна из причин заключается в том, что регулярные выражения имеют Замечательное качество называется компонуемостью .Язык, будь то формальный язык программирования или язык схем, который имеет качество компонуемость (Джеймс Кларк хорошо объясняет это на http://www.thaiopensource.com/relaxng/design.html#section:5) это тот, который позволяет вам использовать его атомарные части и методы композиции и затем легко их рекомбинировать разными способами. Как только вы узнаете различные части регулярных выражений, вы начнете в своем возможность сопоставления строк любого типа.
-
TextMate доступен по адресу http: // www.macromates.com. Для получения дополнительной информации о регулярные выражения в TextMate см. http://manual.macromates.com/en/regular_expressions.
-
Для получения дополнительной информации о Блокноте см. Http://notepad-plus-plus.org. Для документации по используя регулярные выражения в Блокноте, см. http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Regular_Expressions.
-
Узнайте больше о кислороде на http://www.oxygenxml.com. Для информации об использовании regex с помощью поиска и замены, см. http: // www.xygenxml.com/doc/ug-editor/topics/find-replace-dialog.html. Для получения информации об использовании его построителя регулярных выражений для XML Схема, см. Http://www.oxygenxml.com/doc/ug-editor/topics/XML-schema-regexp-builder.html.
Конструктор RegExp () - JavaScript | MDN
Возможны буквенные, конструкторские и заводские обозначения:
/ узор / флаги
новый RegExp (шаблон [, флаги])
RegExp (шаблон [, флаги])
Параметры
-
шаблон
- Текст регулярного выражения.
- Начиная с ES5, это также может быть другой объект или литерал
RegExp
(для
только две нотации конструктора RegExp). Выкройки могут включать специальные
символы для соответствия более широкому диапазону значений, чем буквальная строка. -
флаги
Если указано,
flags
- строка, содержащая флаги для
Добавить.В качестве альтернативы, если для шаблона предоставляется объект,
flags
строка заменит любой из флагов этого объекта (и
lastIndex
будет сброшен на0
) (по состоянию на ES2015).Если
flags
не указан и объект регулярных выражений
указывается, флаги этого объекта (и значениеlastIndex
) будут скопированы
над.flags
может содержать любую комбинацию из следующих
персонажей:-
г
(глобальное соответствие) - Найти все совпадения, а не останавливаться после первого совпадения.
-
i
(без учета регистра) - Если также включен флаг
и
, используйте сворачивание регистра Unicode. и$
) как
работа над несколькими строками. Другими словами, сопоставьте начало или конец
каждая строка (разделенная на\ n
или\ r
), а не только
самое начало или конец всей входной строки. -
s
("dotAll") - Позволяет
.
для соответствия новым строкам. -
u
(юникод) - Обрабатывать шаблон
также двоичные строки). -
y
(липкий) - Соответствует только индексу, указанному свойством
lastIndex
для
это регулярное выражение в целевой строке. Не пытается найти соответствие ни с одним
более поздние индексы.
-
Литеральная нотация и конструктор
Есть два способа создать объект RegExp
: буквальное обозначение
и конструктор .
- Параметры буквального обозначения заключены между косой чертой и
не используйте кавычки. - Параметры функции конструктора не заключены между
косые черты, но используйте кавычки.
Следующие три выражения создают одно и то же регулярное выражение:
/ ab + c / i
новый RegExp (/ ab + c /, 'i')
новый RegExp ('ab + c', 'i')
Буквальное обозначение приводит к компиляции регулярного выражения, когда
выражение оценивается.Используйте буквальную нотацию, если регулярное выражение останется
постоянный. Например, если вы используете буквальную нотацию для построения регулярного выражения
используется в цикле, регулярное выражение не будет перекомпилироваться на каждой итерации.
Конструктор объекта регулярного выражения - например,
new RegExp ('ab + c')
- приводит к компиляции во время выполнения обычного
выражение. Используйте функцию-конструктор, если знаете шаблон регулярного выражения
будет меняться, или вы не знаете шаблон и получаете его из другого источника,
например, пользовательский ввод.
Таблицы BCD загружаются только в браузере
RegExp.prototype.test () - JavaScript | MDN
Метод test ()
выполняет поиск совпадения между
регулярное выражение и указанная строка. Возвращает истину
или
ложь
.
Исходный код этого интерактивного примера хранится в репозитории GitHub. Если вы хотите внести свой вклад в проект интерактивных примеров, клонируйте https://github.com/mdn/interactive-examples и отправьте нам запрос на перенос.
Параметры
-
ул.
- Строка, с которой сравнивается регулярное выражение.
Возвращает
истину
, если есть соответствие между регулярным выражением и строкой
ул.
. В противном случае ложь
.
Используйте test ()
всякий раз, когда вы хотите узнать, найден ли шаблон в
нить. test ()
возвращает логическое значение, в отличие от
Строка.prototype.search ()
(который возвращает индекс совпадения, или
-1
, если не найден).
Для получения дополнительной информации (но с более медленным выполнением) используйте
exec ()
метод. (Это похоже на
String.prototype.match ()
метод.)
Как и в случае с exec ()
(или в сочетании с ним), вызывается test ()
.
несколько раз в одном экземпляре глобального регулярного выражения будет проходить мимо
предыдущий матч.
Использование test ()
Простой пример, который проверяет, содержится ли " hello
" в самом начале
строка, возвращающая логический результат.привет / .test (str);
console.log (результат);
В следующем примере регистрируется сообщение, зависящее от успеха теста:
function testInput (re, str) {
пусть средняя струна;
if (re.test (str)) {
midstring = 'содержит';
} еще {
midstring = 'не содержит';
}
console.log (`$ {str} $ {midstring} $ {re.source}`);
}
Использование test () в регулярном выражении с
«global» флаг
Когда регулярное выражение имеет глобальный
установлен флаг, test ()
продвинет lastIndex
регулярного выражения.( RegExp.prototype.exec ()
также продвигает
lastIndex
свойство.)
Дальнейшие звонки на test ( str )
возобновят поиск
str
начиная с lastIndex
. В
lastIndex Свойство
будет продолжать увеличиваться каждый раз, когда test ()
возвращает истину
.
Примечание: Пока test ()
возвращает true
,
lastIndex
сбрасывает , а не , даже при тестировании другой строки!
Когда test ()
возвращает false
, вызывающее регулярное выражение
lastIndex
свойство будет сброшено на 0
.
Следующий пример демонстрирует это поведение:
const регулярное выражение = / foo / g;
regex.test ('фу')
regex.test ('фу')
regex.test ('barfoo')
regex.test ('foobar')
Таблицы BCD загружаются только в браузере
Regular-Expressions.info — Учебное пособие по регулярным выражениям, примеры и справочные материалы
Регулярное выражение (regex или regexp для краткости) — это специальная текстовая строка для описания шаблона поиска. Вы можете думать о регулярных выражениях как о подстановочных знаках на стероидах.и последний с $) может использоваться программистом, чтобы проверить, ввел ли пользователь правильно отформатированный адрес электронной почты. Всего в одной строке кода, независимо от того, написан ли этот код на Perl, PHP, Java, языке .NET или на множестве других языков.
Быстрый старт с регулярными выражениями
Если вы просто хотите попрактиковаться в регулярных выражениях, взгляните на одностраничное краткое руководство по регулярным выражениям. Хотя вы не можете научиться эффективно использовать регулярные выражения из этого краткого обзора, этого достаточно, чтобы уметь собрать кучу простых регулярных выражений.Каждый раздел в быстром запуске дает прямую ссылку на подробную информацию в учебнике.
Полное руководство по регулярным выражениям
Не беспокойтесь, если приведенный выше пример или краткое руководство не имеют для вас никакого смысла. Любое нетривиальное регулярное выражение выглядит устрашающим для того, кто с ним не знаком. Но, обладая небольшим опытом, вы скоро сможете создавать свои собственные регулярные выражения, как будто вы никогда больше ничего не делали. Бесплатное руководство Regular-Expressions.info объясняет все по крупицам.
Это руководство является уникальным, поскольку оно не только объясняет синтаксис регулярных выражений, но также подробно описывает, как на самом деле механизм регулярных выражений выполняет свою работу. Вы узнаете довольно много, даже если уже какое-то время пользуетесь регулярными выражениями. Это поможет вам быстро понять, почему конкретное регулярное выражение не выполняет то, что вы изначально ожидали, избавляя вас от множества догадок и головной боли при написании более сложных регулярных выражений.
Учебное пособие по замене строк
Строка замены, также известная как текст замены, — это текст, которым заменяется каждое совпадение регулярного выражения во время поиска и замены.В большинстве приложений текст замены поддерживает специальный синтаксис, который позволяет повторно использовать текст, совпадающий с регулярным выражением или его частями, в замене. На этом веб-сайте также есть полное руководство по замене строк, в котором объясняется этот синтаксис. Хотя строки замены довольно просты по сравнению с регулярными выражениями, все же существует большое разнообразие синтаксиса, используемого различными приложениями, и их фактического поведения.
Приложения и языки, поддерживающие регулярные выражения
Существует множество программных приложений и языков программирования, поддерживающих регулярные выражения.Если вы программист, вы можете сэкономить много времени и усилий. Часто с помощью одного регулярного выражения в одной или нескольких строках кода можно выполнить то, что в противном случае заняло бы десятки или сотни.
Многие приложения и языки программирования имеют собственные реализации регулярных выражений, часто с небольшими, а иногда и со значительными отличиями от других реализаций. Когда два приложения используют разные реализации регулярных выражений, мы говорим, что они используют разные «разновидности регулярных выражений».В отличие от большинства других руководств по регулярным выражениям, руководство на этом веб-сайте охватывает все популярные разновидности регулярных выражений и указывает различия, на которые следует обратить внимание.
Не только для программистов
Если вы не программист, вы также можете использовать регулярные выражения во многих ситуациях. Они значительно упрощают поиск информации. Вы можете использовать их в мощных операциях поиска и замены, чтобы быстро вносить изменения в большое количество файлов. Простым примером является gr [ae] y, который находит оба написания слова grey за одну операцию вместо двух.Существует множество текстовых редакторов и инструментов поиска и замены с хорошей поддержкой регулярных выражений.
Дополнительная литература
Если вы захотите получить дополнительную информацию о регулярных выражениях после прочтения этого веб-сайта, существует множество книг по этой теме.
Сделайте пожертвование
Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование на поддержку этого сайта, и вы получите пожизненного доступа без рекламы к этому сайту!
.