Этот урок действительно научил меня регулярным выражениям
Это переведенная статья. Я много раз учил регулярные выражения, но все время забываю учиться и забываю учиться.Когда я их использую, я могу полагаться только на поисковые системы.
На этот раз я видел этот обычный учебник, и я был очень приятно удивлен. Я попытался перевести его снова, но перевод не хорош. Вы можете прочитать оригинальный текст, и это легко понять.
Оригинальный адрес: https://refrf.shreyasminocha.me/
Для получения дополнительных статей вы можете подписаться на мой WeChat: Брат Ю пишет python
1. Введение
Регулярные выражения позволяют определить шаблон и использовать этот шаблон для выполнения соответствующих операций со строками. Подстрока, соответствующая шаблону, называется «совпадением».
Регулярное выражение — это строка символов, определяющая шаблон поиска.
Регулярные выражения в основном используются в следующих сценариях:
- проверка ввода
- Операции поиска и замены
- Расширенные операции со строками
- поиск файла или переименование
- Белые и черные списки
Регулярные выражения не подходят для этих сценариев:
- XML или HTML разбор
- Точные даты матчей
Существует множество движков, реализующих регулярное сопоставление, каждый из которых имеет свои особенности. В этой книге мы не будем обсуждать различия функций (между разными движками) и будем обсуждать только те функции, которые в большинстве случаев являются общими для разных движков.
В примерах в книге используется JavaScript. Поэтому эта книга может быть немного смещена в сторону обычного движка JavaScript.
2 Основы
Регулярные выражения обычно форматируются как/<rules>/<flags>
, обычно опускается для краткости/<flags>
. Мы подробно обсудим флаги в следующей главе.
Давайте начнем с/p/g
Это регулярное выражение запускается. Сейчас, пожалуйста/g
флаг считается фиксированным.
/p/g
Как мы можем видеть,/p/g
Соответствует всем символам p нижнего регистра.
Уведомление
По умолчанию регулярные выражения чувствительны к регистру.
Экземпляры шаблонов регулярных выражений, обнаруженные во входной строке, называются «совпадениями».
/pp/g
3 группы символов
Может соответствовать символу из набора символов.
/[aeiou]/g
[aeiou]/g
Соответствует всем гласным во входной строке.
Вот еще один пример:
/p[aeiou]t/g
Мы сопоставляем букву p, за которой следует гласная, за которой следует t.
Существует более интуитивно понятный ярлык, который соответствует символу в непрерывном диапазоне.
/[a-z]/g
предупреждать
выражение
/[a-z]/g
Совпадение только с одним символом. В приведенном выше примере у каждого символа есть отдельное совпадение. Не вся строка совпадает.
Мы также можем комбинировать диапазоны и отдельные символы в регулярных выражениях.
/[A-Za-z0-9_-]/g
наше регулярное выражение/[A-Za-z0-9_-]/g
Совпадение с символом, который должен быть (как минимум) одним из следующих символов:
A-Z
a-z
0-9
-
_
или-
Мы также можем «отрицать» эти правила:
/[^aeiou]/g
/[aeiou]/g
и/[^aeiou]/g
Единственная разница в том, что ^ стоит сразу после открывающей скобки. Его цель — «отменить» правила, определенные в скобках. Это значит:
соответствует любому символу, кроме a, e, i, o и u
3.1 Пример
недопустимые символы имени пользователя
/[^a-zA-Z_0-9-]/g
указанный персонаж
/[A-HJ-NP-Za-kmnp-z2-9]/g
4 персонажа побега
Экранирование символов — это сокращенные выражения для некоторых распространенных классов символов.
4.1 Цифровые символы\d
Побеги\d
Указывает сопоставление числовых символов 0-9. Эквивалентно[0-9]
.
-
/\d/g
(Пожалуйста, внимательно прочитайте здесь)
/\d\d/g
\D
да\d
На обороте эквивалент[^0-9]
.
/\D/g
4.2 Слово персонажей\w
Побеги\w
Сопоставьте символы слова. включают:
- строчные буквы а-я
- Заглавные буквы A-Z
- Числа 0-9.
- подчеркивать _
Эквивалент [a-zA-Z0-9_]
/\w/g
/\W/g
4.3 Пробелы\s
Побеги\s
Совпадение с пробелами. Точный набор совпадающих символов зависит от механизма регулярных выражений, но большинство из них включают как минимум:
- космос
- с разделителями табуляции
\t
- Входить
\r
- новая линия
\n
- Изменять
\f
Другие могут включать вертикальные вкладки (\v). Механизмы самораспознавания Unicode обычно соответствуют всем символам в категории разделителей. Впрочем, технические детали обычно не важны.
/\s/g
-
/\S/g
(Заглавные буквы)
4.4 Любой персонаж.
Однако это не типичный побег персонажа..
Вы можете сопоставить любой символ. (Кроме перевода строки \n-, модификатором dotall может быть перевод строки \n)
/./g
5 Побег
В регулярных выражениях некоторые символы имеют особое значение, которое мы рассмотрим в этой главе:
|
{,}
(,)
[,]
-
^
,$
-
+
,*
,?
\
-
.
Только в буквальном классе персонажа. -
-
: иногда является специальным символом в классе символов.
Если мы хотим сопоставить эти символы буквально, мы можем добавить к этим символам префикс
\
«Убежать» от них.
/\(paren\)/g
/(paren)/g
/example\.com/g
/example.com/g
/A\+/g
/A+/g
/worth \$5/g
/worth $5/g
5.1 Примеры
Встроенные комментарии JavaScript
/\/\/.*
Подстрока, окруженная звездочками
/*[^\*]*\*
Первые и последние звездочки буквально все, что они используют\*
Побег. Звездочку в наборе символов экранировать не нужно, но я ее экранировал для ясности. Звездочка сразу после набора символов указывает на повторение набора символов, который мы рассмотрим в одной из последующих глав.
6 комплектов
Как следует из названия, группы используются для «группировки» компонентов регулярного выражения. Эти группы можно использовать для:
- Соответствие извлеченного подмножества
- Повторите группу любое количество раз
- Ссылка на ранее совпавшую подстроку
- улучшить читаемость
- разрешить сложные замены
В этой главе мы узнаем, как работают группы, а в последующих главах будет больше примеров.
6.1 Группы захвата
Группа захвата обозначена (...). Ниже приведен пример иллюстрации:
/a(bcd)e/g
Группы захвата позволяют извлекать частичные совпадения.
/\{([^{}]*)\}/g
С помощью обычных функций языка вы сможете извлекать текст, соответствующий заключенным в круглые скобки.
Группы захвата также можно использовать для группировки частей регулярных выражений для удобства повторения. Хотя мы подробно рассмотрим повторение в следующих главах, вот пример, демонстрирующий полезность групп.
/a(bcd)+e/g
В других случаях они используются для группировки логически схожих частей регулярного выражения для удобства чтения.
/(\d\d\d\d)-W(\d\d)/g
6.2 Возврат
Возврат позволяет ссылаться на ранее захваченные подстроки.
Чтобы соответствовать первой группе, вы можете использовать\1
Второй набор сопоставления может быть использован\2
,Так далее и тому подобное…
/([abc])×\1×\1/g
Поиск с возвратом нельзя использовать для уменьшения повторения в регулярных выражениях. Они относятся к сопоставлению групп, а не шаблонов.
/[abc][abc][abc]/g
/[abc]\1\1/g
Вот пример, демонстрирующий распространенный вариант использования:
/\w+([,|])\w+\1\w+/g
Этого нельзя достичь с помощью повторяющихся классов символов.
/\w+[,|]\w+[,|]\w+/g
6.3 Группы без захвата
Не захватывающие группы очень похожи на захватывающие группы, за исключением того, что они не создают «захват». Вместо этого это берет форму (?: ...)
Группы без захвата часто используются с группами захвата. Возможно, вы пытаетесь извлечь какую-то часть совпадения, используя группы захвата. Хотя вы можете захотеть использовать группу, не нарушая порядок захвата, вам следует использовать группу без захвата.
6.4 Примеры
параметры строки запроса
/^\?(\w+)=(\w+)(?:&(\w+)=(\w+))*$/g
Мы сопоставляем первый набор пар ключ-значение по отдельности, так как это позволяет нам использовать разделитель & как часть повторяющейся группы.
(Основные) HTML-теги
Как правило, не используйте регулярные выражения для соответствия XML/HTML. Тем не менее, я все же приведу соответствующий пример:
/<([a-z]+)+>(.*)<\/\1>/gi
Имя
Находить:\b(\w+) (\w+)\b
заменять:1
В операциях по замене часто используется2; использование захвата
\1
,\2
перед заменой
John Doe
Jane Doe
Sven Svensson
Janez Novak
Janez Kranjski
Tim Joe
после замены
Doe, John
Doe, Jane
Svensson, Sven
Novak, Janez
Kranjski, Janez
Joe, Tim
Возврат и комплексные числа
Находить:\bword(s?)\b
заменять:phrase$1
перед заменой
This is a paragraph with some words.
Some instances of the word "word" are in their plural form: "words".
Yet, some are in their singular form: "word".
после замены
This is a paragraph with some phrases.
Some instances of the phrase "phrase" are in their plural form: "phrases".
Yet, some are in their singular form: "phrase".
7 повторов
Повторение — это мощная и распространенная функция регулярных выражений. Существует несколько способов представления повторения в регулярных выражениях.
7.1 Опции
Можем ли мы его использовать? Установите порцию на выбор (0 или 1 раз).
/a?/g
другой пример:
/https?/g
Мы также можем сделать групповое программирование с захватом и без захвата необязательным.
/url: (www\.)?example\.com/g
7.2 Ноль или более раз
Если мы хотим сопоставить ноль или более токенов, мы можем использовать * в качестве суффикса.
/a*/g
Наше регулярное выражение соответствует даже пустой строке.
7.3 Один или несколько раз
Если мы хотим сопоставить 1 или более токенов, мы можем использовать + в качестве суффикса.
/a+/g
7.4 Точно х раз
Если мы хотим сопоставить конкретный токен ровно x раз, мы можем добавить суффикс {x}. Функционально это эквивалентно копированию и вставке тега x раз.
/a{3}/g
Ниже приведен пример шестнадцатеричного кода цвета, который соответствует шести символам верхнего регистра.
/#[0-9A-F]{6}/g
Здесь токен {6} применяется к набору символов [0-9A-F].
7.5 Между минимальным и максимальным заказами
Если мы хотим сопоставить конкретный токен между min и max, мы можем добавить после этого токена{min,max}
.
/a{2,4}/g
предупреждать
{min,max}
Не ставьте пробел после запятой.
7.6 Минимум х раз
Если мы хотим сопоставить конкретный токен хотя бы x раз, мы можем добавить {x,} после токена. Аналогичен {min, max}, за исключением того, что нет верхнего предела.
/a{2,}/g
Жадный режим Notes 7.7
Регулярные выражения по умолчанию используют жадный режим. В жадном режиме будет найдено как можно больше символов.
/a*/g
/".*"/g
После **операторов повторения (?, *, +, ...)** добавить?
, что может сделать сопоставление "ленивым".
/".*?"/g
Здесь это также можно сделать с помощью[^"]
заменять. (это лучшая практика).
/"[^"]*"/g
Лень означает остановку, как только условие выполняется, а жадность означает остановку только тогда, когда условие больше не выполняется.
-Andrew S on StackOverflow
/<.+>/g
/<.+?>/g
7.8 Примеры
биткойн-адрес
-
/([13][a-km-zA-HJ-NP-Z0-9]{26,33})/g
(Думая: {26,33}?)
YouTube видео
/(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?.*?v=([^&\s]+).*/gm
Мы можем использовать якорь, чтобы он соответствовал последнему выражению, не корректировал неправильную ссылку, и тогда мы вступим в контакт.
8 попеременно
Альтернативный позволяет сопоставить одну из нескольких фраз. Это более мощно, чем группы символов, ограниченных одним символом.
Используйте символ трубы|
Чтобы различать несколько фраз
/foo|bar|baz/g
Соответствует одному из foo, bar и baz.
Если только часть регулярного выражения должна «чередоваться», ее можно обернуть группами, как захватывающими, так и не захватывающими группами.
/Try (foo|bar|baz)/g
За try следует один из foo, bar и baz.
Совпадение чисел от 100 до 250:
/1\d\d|2[0-4]\d|250/g
Это можно использоватьRegex Numeric Range Generatorгенерация инструмента.
пример
шестнадцатеричный цвет
Давайте рассмотрим пример улучшенного сопоставления цветов перед шестнадцатеричным кодом.
/#[0-9A-F]{6}|[0-9A-F]{3}
[0-9A-F]{6}
разместить[0-9A-F]{3}
спереди, это очень важно. в противном случае:
/#([0-9A-F]{3}|[0-9A-F]{6})/g
намекать
Механизм регулярных выражений чередует попытки слева направо.
римские цифры
/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/g
9 модификатор
Модификатор позволяет нам разделить регулярное выражение в другой «режим».
модификатор/pattern/
задняя часть.
Разные движки поддерживают разные модификаторы. Здесь мы обсуждаем только самые распространенные модификаторы.
9.1 Глобальный модификатор (g)
До сих пор во всех примерах устанавливался глобальный модификатор. Если вы не включите глобальные модификаторы, регулярное выражение не будет больше соответствовать символам после первого.
/[aeiou]/g
/[aeiou]/
Модификатор нечувствительности дела 9.2 (I)
Как следует из названия, включение этого модификатора делает соответствие регулярного выражения нечувствительным к регистру.
/#[0-9A-F]{6}/i
/#[0-9A-F]{6}/
/#[0-9A-Fa-f]{6}/
9.3 Модификатор многострочного режима (m)
Ограниченная поддержка
В Ruby модификатор m предназначен для выполнения других функций.
Модификатор multiline связан с обработкой якорей при работе с «многострочными» строками, содержащими новые строки. по умолчанию,/^foo$/
Соответствует только "foo".
Мы могли бы захотеть, чтобы он также соответствовал foo в одной строке многострочной строки.
мы принимаем"bar\nfoo\nbaz"
Например:
bar
foo
baz
Без модификатора m приведенная выше строка будет рассматриваться как одна строка.bar\nfoo\nbaz
, регулярное выражение^foo$
Не удалось сопоставить символы.
С модификатором m приведенная выше строка будет рассматриваться как 3 строки.^foo$
Может соответствовать средней линии.
9.4 Модификатор(ы) Dot-all
Ограниченная поддержка
JavaScript до ES2018 не поддерживает этот модификатор. Ruby также не поддерживает этот модификатор, вместо этого он обозначается m.
.
Обычно соответствует любому символу, кроме новой строки. Он также может соответствовать новому модификатору нью-модификатора.
10 якорей
Сам якорь ни к чему не подходит. Однако они ограничивают места появления совпадений.
Вы можете поставить якорь как «невидимый персонаж».
10.1 Начало линии^
Вставить в начало регулярного выражения^
, так что остальная часть регулярного выражения должна совпадать с началом строки. Вы можете думать об этом всегда как о совпадении невидимого символа в начале строки.
/^p/g
10.2 Окончания строк
вставить в конец регулярного выражения$
, аналогично началу строки. Вы можете думать об этом всегда как о совпадении невидимого символа в конце строки.
/p$/g
^
и$
Якоря часто используются вместе, чтобы убедиться, что регулярные выражения и строки совпадают полностью, а не только частично.
/^p$/g
Давайте рассмотрим пример из повторения и добавим две привязки в конце регулярного выражения.
/^https?$/g
Без этих двух якорей,http/2
иshttp
также будет соответствовать.
10.3 Границы слов\b
Граница слова — это позиция между символом и символом, не являющимся словом.
якорь границы слова\b
, воображаемый невидимый символ, который существует между совпадающим символом и символом, не являющимся словом.
/\bp/g
намекать
символы включают
a-z
,A-Z
,0-9
, и_
.
/\bp\b/g
/\bcat\b/g
Существует также неразрушающий граничный якорь\B
.
Как следует из названия, он соответствует всему, кроме границ слов.
/\Bp/g
/\Bp\B/g
намекать
^…$
и\b…\b
являются общими шаблонами, и вам почти всегда нужны эти 2, чтобы предотвратить случайные совпадения.
10.4 Примеры
конечный пробел
/\s+$/gm
заголовок уценки
/^## /gm
Без анкеров:
/## /gm
11 утверждений нулевой ширины (осмотр)
Утверждения нулевой ширины можно использовать для проверки условий без сопоставления какого-либо текста.
Вы можете только видеть, не можете двигаться.
- Утверждение Lookhead
- положительный
(?=…)
- отрицательный
(?!…)
- положительный
- Смотреть за
- положительный
(?<=…)
- отрицательный
(?<!…)
- положительный
11.1 первое утверждение (lookhead)
положительный
/_(?=[aeiou])/g
Обратите внимание, что следующие символы не совпадают. В этом можно убедиться, посмотрев на переднюю часть.
/(.+)_(?=[aeiou])(?=\1)/g
Обычный двигатель в_
использовал(?=[aeiou])
и(?=\1)
Проверять.
/(?=.*#).*/g
Отрицательный
/_(?![aeiou])/g
/^(?!.*#).*$/g
Если якоря нет, будет соответствовать часть без # в каждом примере.
Отрицательные прогнозные утверждения часто используются для предотвращения сопоставления определенных фраз.
/foo(?!bar)/g
/---(?:(?!---).)*---/g
11.2 Примеры
Проверка пароля
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/
Утверждения нулевой ширины можно использовать для проверки нескольких условий.
строка в кавычках
/(['"])(?:(?!\1).)*\1/g
Без прогнозного утверждения лучшее, что мы можем сделать, это следующее:
/(['"])[^'"]*\1/g
12 продвинутых примеров
JavaScript-комментарии
/\/\*[\s\S]*?\*\/|\/\/.*/g
[\s\S]
это трюк для соответствия любому символу, включая символы новой строки. Мы избегаем модификатора dot-all, потому что нам нужно использовать.
Представляет однострочный комментарий.
24 часа
/^([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/g
айпи адрес
/\b(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.){3}(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))\b/g
Мета-теги
/<Example source="(.*?)" flags="(.*?)">/gm
заменять:<Example regex={/$1/$2}>
число с плавающей запятой
-
необязательный символ
-
Дополнительная целочисленная часть
-
необязательная дробная часть
-
необязательный раздел экспоненты
-
/^([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?$/g
положительное прогнозное утверждение(?=\.\d|\d)
убедитесь, что это не совпадает..
цвет HSL
Целое от 0 до 360
/^0*(?:360|3[0-5]\d|[12]?\d?\d)$/g
процент
/^(?:100(?:\.0+)?|\d?\d(?:\.\d+)?)%$/g
HSL и процент
/^hsl\(\s*0*(?:360|3[0-5]\d|[12]?\d?\d)\s*(?:,\s*0*(?:100(?:\.0+)?|\d?\d(?:\.\d+)?)%\s*){2}\)$/gi
13 Следующий шаг
Если вы хотите узнать больше о регулярных выражениях и о том, как они работают:
- awesome-regex
regex
tag on StackOverflow- StackOverflow RegEx FAQ
- r/regex
- RexEgg
- Regular-Expressions.info
- Regex Crossword
- Regex Golf
Спасибо за чтение!添加微信:雨哥写 python