Руководство пользователя обычных рейдеров
предисловие
Регулярные выражения — одно из немногих замечательных изобретений в программном обеспечении. Наравне с ним находятся сети с коммутацией пакетов, Интернет, Лисп, хеш-алгоритмы, 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, обратите внимание на правила группы захвата здесь |
Если вы не знаете порядок захватываемых групп, вот простое правило: считать слева направо >>> Первый символ '(' - это первая захватываемая группа
(Особенно применимо, когда в группе захвата есть группа захвата) (В функциональном режиме это особенно полезно при деструктурировании назначения)
$`: эквивалентен тексту слева от обычного совпадающего содержимого.
$': эквивалентен тексту справа от содержимого, совпадающему с обычным
$&: регулярно совпадающий контент
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 — обычные расширения@Руан Ифэн