Обычное руководство пользователя Raiders, вы уверены, что не хотите зайти и посмотреть?

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

Руководство пользователя обычных рейдеров

предисловие

Регулярные выражения — одно из немногих замечательных изобретений в программном обеспечении. Наравне с ним находятся сети с коммутацией пакетов, Интернет, Лисп, хеш-алгоритмы, UNIX, методы компиляции, реляционные модели, объектная ориентация и многое другое. Обычный сам по себе прост, красив, мощен и бесконечно полезен.

Изучение регулярных выражений, грамматика не сложная, посмотрите на несколько примеров, и вы можете следовать за тыквой. Но три-две статьи о фаст-фуде мало кто может понять глубоко. Когда мы снова встретимся, нам нужно снова искать, но бамбуковая корзина пуста. Не только регулярные, но и другие технические моменты одинаковы, что требует систематического обучения. Читайте больше классических книг и идите на плечах гигантов.

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

(Проще говоря, регулярное обучение — это высокие инвестиции и низкий доход) (сначала было легко понять, но после более глубокого понимания я вздохнул от силы регулярного обучения)

Полный текст немного длиннее, вы можете выбрать интересующую часть для чтения

1. Введите регулярность

Строго говоря, регулярные выражения — это метод формальных выражений для описания шаблона структуры строк. Начинал в области математики, популярной благодаря регулярному движку Perl. JavaScript представил регулярные выражения из ES 3, а ES 6 расширил поддержку регулярных выражений.

канонический принцип

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

Реализация механизма регулярных выражений использует специальную теоретическую модель: конечные автоматы (Finite Automata) также называется конечным автоматом (finite-state machine) подробности см. в справочной документации внизу статьи

группа символов

группа символов имея в виду
[ab] соответствует a или b
[0-9] соответствует 0 или 1 или 2 ... или 9
[^ab] Сопоставьте любой символ, кроме A и B
группа символов имея в виду
\d Представляет [0-9], числовые символы
\D Представляет [^0-9], нечисловые символы
\w Представляет [_0-9a-zA-Z], словесные символы, обратите внимание на подчеркивание
\W Представляет [^_0-9a-zA-Z], символ, не являющийся словом
\s означает [\t\v\n\r\f], пробел
\S означает [^ \t\v\n\r\f], без пробелов
. Представляет [^\n\r\u2028\u2029]. Подстановочный знак, соответствует любому символу, кроме символа новой строки, возврата каретки, разделителя строк и разделителей сегментов.

квантификатор

квантификатор приоритета соответствия Игнорировать квантификаторы приоритета имея в виду
{m,n} {m,n}? означает не менее m раз и не более n раз
{m,} {m,}? означает не менее m вхождений
{m} {m}? означает, что должно встречаться m раз, что эквивалентно {m,m}
? ?? Эквивалент {0,1}
+ +? Эквивалент {1,}
* *? Эквивалент {0,}

Якоря и утверждения

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

Якорь имея в виду
^ Совпадение в начале, при многострочном сопоставлении совпадение с началом строки
$ Конец совпадения, совпадение конца строки в многострочном совпадении
\b граница слова, между \w и \W
\B границы без слов
(?=p) Символ после позиции должен соответствовать p
(?!p) Символ после позиции не соответствует p

требует внимания,\bтакже включают\wа также^положение между и\wа также$положение между. как показано на рисунке.

модификатор

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

модификатор имея в виду
i совпадение без учета регистра
m Позволяет сопоставлять несколько строк
g выполнить глобальное совпадение
u Режим Unicode, используемый для правильной обработки более чем\uFFFFСимволы Unicode, которые обрабатывают четырехбайтную кодировку UTF-16.
y Режим склеивания, аналогичный g, является глобальным совпадением, но особенностью является то, что следующее совпадение начинается со следующей позиции, где предыдущее совпадение было успешным, и должно начинаться с первой оставшейся позиции, что и означает «склейка». .
s Режим dotAll, в основном используемый для обработки разделителей строк.

2, обычный метод

Строковые объекты имеют 4 метода, которые могут использовать регулярные выражения:match(),replace(),search()а такжеsplit().

ES6 вызывает все эти 4 метода внутри языкаRegExpМетод экземпляра , чтобы все обычные методы были определены вRegExpна объекте.

String.prototype.matchпередачаRegExp.prototype[Symbol.match]

String.prototype.replaceпередачаRegExp.prototype[Symbol.replace]

String.prototype.searchпередачаRegExp.prototype[Symbol.search]

String.prototype.splitпередачаRegExp.prototype[Symbol.split]

String.prototype.match

String.prototype.replace

Метод замены строк должен быть одним из наших наиболее часто используемых методов.Здесь я дам подробное описание различных стратегий использования.

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

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

имя переменной представляет значение
? Вставьте «$».
$& Вставьте совпадающие подстроки.
$` Вставляет содержимое слева от текущей подстроки.
$' Вставляет содержимое справа от текущей подстроки.
$n Если первый параметрRegExpобъект, а n — целое неотрицательное число меньше 100, вставьте строку, соответствующую n-й скобке. Подсказка: индекс начинается с 1, обратите внимание на правила группы захвата здесь

Если вы не знаете порядок захватываемых групп, вот простое правило: считать слева направо >>> Первый символ '(' - это первая захватываемая группа

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

$`: эквивалентен тексту слева от обычного совпадающего содержимого.

$': эквивалентен тексту справа от содержимого, совпадающему с обычным

$&: регулярно совпадающий контент

1 -n: соответствует группе захвата

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

Ниже приведены параметры этой функции:

имя переменной представляет значение
match Соответствующая подстрока. ($ & соответствует приведенному выше.)
p1,p2, ... Если первый параметр метода replace() являетсяRegExpобъект, который представляет строку, соответствующую n-й скобке. (Соответствует $1, $2 и т. д. выше.) Например, если вы используете/(\a+)(\b+)/это чтобы соответствовать,p1совпадает\a+, p2 就是匹配的 \b+。
offset Смещение совпадающей подстроки в исходной строке. (Например, если исходная строка была «abcd», а совпадающая подстрока была «bc», то этот параметр будет равен 1)
string Исходная строка для сопоставления.

Пример из расширенного текста, чтобы соответствовать адресу тега изображения внутри

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

String.prototype.search

String.prototype.split

RegExp.prototype.test

Аналогичен String.prototype.search, но этот возвращает логическое значение, а поиск возвращает нижний индекс, что с семантической точки зрения больше подходит для корректуры

RegExp.prototype.exec

3. Регулярное и обычное использование

Основное содержание — новые модификаторы (u, y, s) в ES6 (g, m, i упоминаться не буду), жадные и не жадные режимы, look-ahead/look-behind утверждения

модификатор 'у'

ES6 добавлен в регулярное выражениеuмодификатор, означающий «режим Unicode», используемый для правильной обработки более чем\uFFFFсимволы Юникода. То есть четырехбайтная кодировка UTF-16 обрабатывается правильно. Хватит нести чушь, посмотрите на картинки

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

модификатор y

Кромеuмодификаторы, ES6 также добавляет регулярные выраженияyмодификаторы, называемые «липкими» модификаторами.

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

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]

r1.exec(s) // ["aa"]
r2.exec(s) // null

В приведенном выше коде есть два регулярных выражения, одно из которых используетgмодификатор, другой используетyмодификатор. Каждое из этих двух регулярных выражений выполняется дважды.При первом выполнении оба ведут себя одинаково, а остальные строки_aa_a. из-заgУ украшения нет требований к расположению, поэтому второе выполнение возвращает результат, иyМодификатор требует, чтобы совпадение начиналось с головы, поэтому вернитеnull.

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

var s = 'aaa_aa_a';
var r = /a+_/y;

r.exec(s) // ["aaa_"]
r.exec(s) // ["aa_"]

Каждый матч в вышеуказанном коде начинается во главе оставшейся строки.

использоватьlastIndexсвойства, которые могли бы быть лучше объясненыyмодификатор.

const REGEX = /a/g;

// 指定从2号位置(y)开始匹配
REGEX.lastIndex = 2;

// 匹配成功
const match = REGEX.exec('xaya');

// 在3号位置匹配成功
match.index // 3

// 下一次匹配从4号位开始
REGEX.lastIndex // 4

// 4号位开始匹配失败
REGEX.exec('xaya') // null

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

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

const REGEX = /a/y;

// 指定从2号位置开始匹配
REGEX.lastIndex = 2;

// 不是粘连,匹配失败
REGEX.exec('xaya') // null

// 指定从3号位置开始匹配
REGEX.lastIndex = 3;

// 3号位置是粘连,匹配成功
const match = REGEX.exec('xaya');
match.index // 3
REGEX.lastIndex // 4

Фактически,yМодификаторы неявно соответствуют флагам в заголовке^.

/b/y.exec('aba')
// null

Поскольку приведенный выше код не может гарантировать совпадение заголовка, он возвращаетnull.yДизайнерский замысел модификатора состоит в том, чтобы голова соответствовала логотипу.^Оба действительны в глобальных матчах.

Ниже находится строковый объектreplaceПримеры методов.

const REGEX = /a/gy;
'aaxa'.replace(REGEX, '-') // '--xa'

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

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

'a1a2a3'.match(/a\d/y) // ["a1"]
'a1a2a3'.match(/a\d/gy) // ["a1", "a2", "a3"]

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

const TOKEN_Y = /\s*(\+|[0-9]+)\s*/y;
const TOKEN_G  = /\s*(\+|[0-9]+)\s*/g;

tokenize(TOKEN_Y, '3 + 4')
// [ '3', '+', '4' ]
tokenize(TOKEN_G, '3 + 4')
// [ '3', '+', '4' ]

function tokenize(TOKEN_REGEX, str) {
  let result = [];
  let match;
  while (match = TOKEN_REGEX.exec(str)) {
    result.push(match[1]);
  }
  return result;
}

В приведенном выше коде, если в строке нет недопустимых символов,yмодификатор сgМодификаторы результатов извлечения те же. Однако, как только появляется недопустимый символ, оба ведут себя по-разному.

tokenize(TOKEN_Y, '3x + 4')
// [ '3' ]
tokenize(TOKEN_G, '3x + 4')
// [ '3', '+', '4' ]

В приведенном выше кодеgмодификатор игнорирует недопустимые символы, в то время какyМодификаторы этого не делают, что облегчает обнаружение ошибок.

К сожалению, совместимость с этим браузером не очень хорошая.

Однако, если вы интегрировали babel в свой проект, вы можете использовать два вышеуказанных модификатора, они

@babel-plugin-transform-es2015-sticky-regex

@babel-plugin-transform-es2015-unicode-regex

модификатор 's'

Регулярное выражение, точка (.) — это специальный символ, представляющий любой отдельный символ, за двумя исключениями. Один из них представляет собой четырехбайтовый символ UTF-16, который можно использовать сuМодификатор разрешается; другой является символом конца строки.

Так называемый терминатор строки — это символ, обозначающий конец строки. Следующие четыре символа являются «разделителями строк».

  • U+000A Новая строка (\n)
  • U+000D возврат каретки (\r)
  • Разделитель строк U+2028 (разделитель строк)
  • Разделитель абзацев U+2029 (разделитель абзацев)

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

/foo.bar/.test('foo\nbar')	// false
/foo[^]bar/.test('foo\nbar')	// true
/foo[\s\S]bar/.test('foo\nbar')		// true 我喜欢这种

Жадный режим и нежадный режим (ленивый режим)

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

Не жадный режим: пусть регулярное выражение соответствует только контенту, которое удовлетворяет выражению, то есть после того, как совпадение успешно, он не будет продолжаться. Это не жадный режим. Просто добавьте? ** После ** квантификатора.

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

На данный момент был захвачен очень странный набор тегов.Если наша цель захватывать только теги img, то это явно не идеально.На данный момент здесь можно использовать нежадный режим.

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

Утверждение просмотра вперед/назад (отрицательное)

有时候,我们会有些需求,具体是:匹配xxx前面/后面的xxx。 It is embarrassing that a long time ago, only supports the first assertion (lookahead) and the first negative assertion (negative lookahead), does not support the assertion underwent (lookbehind) and underwent negative assertion (negative lookbehind), was introduced underwent after ES2018 утверждение

имя Обычный имея в виду
опережающее утверждение /want(?=asset)/ соответствует содержимому, предшествующему активу
Упреждающее отрицательное утверждение /want(?!asset)/ нужны совпадения только в том случае, если они не находятся перед активом
ретроспективное утверждение /(?<=asset)want/ соответствует содержимому после актива
ретроспективное отрицательное утверждение /(?<!asset)want/ нужны совпадения, только если они не после актива

Честно говоря, по моему опыту, сценариев использования backline assertions больше, потому что в js много хранилища данных в виде пар имя-значение, столько раз мы хотим получить следующие значения через "имя =" , это сценарий использования backline assertion

Предварительное утверждение: соответствие только числам до/не до знака процента

Заднее утверждение:

Вот пример от @Yu Bo, также называемой статьей She Eagle.Сообщение блогаСодержание

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

(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))

Реализация «утверждения просмотра назад» должна сначала соответствовать/(?<=y)x/изx, затем снова налево, совпадаяyчасть. Этот порядок выполнения «сначала направо, потом налево», в отличие от всех других обычных операций, приводил к неожиданному поведению.

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

/(?<=(\d+)(\d+))$/.exec('1053') // ["", "1", "053"]
/^(\d+)(\d+)$/.exec('1053') // ["1053", "105", "3"]

В приведенном выше коде нам нужно зафиксировать два групповых совпадения. Без «утверждения просмотра назад» первая скобка находится в жадном режиме, а вторая скобка может захватить только один символ, поэтому результат105а также3. В случае «утверждения за строкой», поскольку порядок выполнения справа налево, вторая скобка является жадным режимом, а первая скобка может захватить только один символ, поэтому результат1а также053.

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

/(?<=(o)d\1)r/.exec('hodor')  // null
/(?<=\1d(o))r/.exec('hodor')  // ["r", "o"]

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

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

именованный групповой матч

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

В приведенном выше коде «соответствие именованной группы» заключено в круглые скобки, а «вопросительный знак + угловая скобка + имя группы» добавляется к заголовку шаблона (?<year>), тогда ты можешьexecметод возвращает результатgroupsИмя группы указано в свойстве. При этом числовой порядковый номер (matchObj[1]) остается в силе.

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

Если именованная группа не совпадает, то соответствующаяgroupsСвойства объекта будутundefined.

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

ссылка на именованную группу

Если вы хотите сослаться на «совпадение именованной группы» внутри регулярного выражения, вы можете использовать\k<组名>письма.

4. Общие правила

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

Если вы хотите сгенерировать обычный объект из строки, есть два способа: один — буквальный, другой — конструктор.

Конструктор:new Regexp('content', 'descriptor')

Буквальный режим (пожалуйста, попробуйте поймать):

const input = '/123/g'
const regexp = eval(input)

Проверить надежность пароля

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

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$

Неполный номер Неполный буквенно-цифровой пароль из 6-15 цифр Упреждающее отрицательное утверждение

/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,15}$/

Проверить китайский

Строки могут быть только на китайском языке.

^[\u4e00-\u9fa5]{0,}$

Подтвердить идентификационный номер

15 бит

^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$

18 бит

^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$

проверить дату

Проверка даты в формате «гггг-мм-дд» с учетом високосных лет.

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

Извлечь URL-ссылки

Следующее выражение отфильтровывает URL-адреса во фрагменте текста.

^(f|ht){1}(tp|tps):\/\/([\\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?

Извлеките адрес тега изображения

Если вы хотите извлечь всю информацию об изображении на веб-странице, вы можете использовать следующее выражение.

/<img [^>]*?src="(.*?)"[^>]*?>/g;

5. Вопросы, требующие внимания

Используйте незахватывающие круглые скобки

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

убрать ненужные скобки

Ненужные скобки иногда могут помешать оптимизации движка. Например, если вам не нужно знать.*последний совпадающий символ, в противном случае не используйте(.)*.

Не злоупотребляйте набором символов

Избегайте групп из отдельных символов. Например[.]или[*], который может быть преобразован в\.а также\*\.

Использовать начальную привязку

За исключением особых обстоятельств,.*Регулярные выражения в начале должны быть добавлены вверху^. Если выражение не соответствует началу строки, очевидно, что оно не совпадает больше нигде.

Извлечение необходимых элементов из квантификаторов

использоватьxx*заменятьx+Можно оставить «х», что необходимо для соответствия. По аналогии,-{5,7}Может написать-----{0,2}. (читабельность может быть немного нарушена)

Извлеките необходимые элементы в начале структуры множественного выбора

использоватьth(?:is|at)заменять(?:this|that), можно выставить нужный "й".

Игнорировать приоритет или совпадать с приоритетом?

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

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

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

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

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

Избегайте экспоненциальных совпадений

Избегайте экспоненциального отклонения от угла сопоставления регулярных выражений, который должен быть максимально уменьшен.+ *Стекирование квантификаторов, например([^\\"]+)*. Тем самым уменьшая возможные ситуации сопоставления и ускоряя скорость сопоставления.

6. Резюме

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

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

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

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

Написано в последнем

Спасибо авторам следующих справочных документов за обмен

Освоение регулярных выражений (третье издание)

Передняя регулярность две или три вещиПризнания @Code Jun

Начало работы с ES6 — обычные расширения@Руан Ифэн