предисловие
Эта серия является предыдущим постом автораОкончание фронтенда высокочастотного интервьюДополнение будет больше тяготеть к вопросам мидл и хай-энд фронтенд интервью.Конечно, все прошли путь от новичка, и заинтересованные друзья могут его посмотреть.
чат
Когда дело доходит до регулярности, первой реакцией каждого должны быть различные формы для проверки того, какое имя пользователя, пароль и почтовый ящик... Это правда, что внешний интерфейс использует регулярность для проверки пользовательского ввода, что является наиболее распространенным сценарием, но я считаю, что большинство внешние интерфейсы игнорируют точку знания регулярности Как и я, Ctrl+c Ctrl+v Все виды регулярных выражений под рукой, ха-ха, мое сердце рухнуло, когда я посмотрел на шаблон исходного кода Vue, анализирующий это регулярное выражение (что это за марсианин) Тогда давайте уничтожим его от имени луны
vue源码-解析属性相关正则
/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
1 Что такое регулярное выражение
Ответ: Регулярные выражения используются для обработки строк.
Как с этим бороться?
Регулярные выражения (регулярные выражения) описывают набор строк, его можно использовать для проверки того, действительно ли строка символов, содержащая определенную подстроку, совпадающую с подстроками, заменена или удалена из строки, соответствует определенному критерию подстроки и так далее.
"Запомните две ключевые роли: 1. Поиск строки 2. Замена строки
2 Как создавать регулярные выражения
- Метод 1: буквальный метод
Формат синтаксиса: /regex body/modifier (необязательно)
const reg = /\d/gi;
- Способ 2: Конструктор
Формат синтаксиса: new RegExp (тело регулярного выражения [ модификатор])
const reg = new RegExp('\d', 'gi')
Контраст: литеральный метод более лаконичен и эффективен, но не может объединять переменные.
обычно используетсямодификаторследующим образом
| модификатор | эффект |
|---|---|
| i | Игнорировать соответствие регистра |
| g | Глобальное сопоставление, то есть после сопоставления одного продолжать сопоставление до конца |
| m | Многострочное сопоставление, то есть сопоставление не прекращается после появления новой строки до конца. |
3 Синтаксис регулярных выражений
3.1 Набор символов и класс диапазона[ ]
"Наборы символов и классы диапазонов определяются с помощью квадратных скобок [] Отличие: класс диапазона связан с дефисами в квадратных скобках [] (левый должен быть меньше правого, иначе будет сообщено об ошибке)
3.2 Предопределенные классы метасимволов
| код | иллюстрировать |
|---|---|
| . | соответствует любому одиночному символу, кроме символов новой строки и терминаторов |
| \d | Числа соответствия, эквивалентные [0-9] |
| \D | Соответствует не цифрам, эквивалентным [^0-9] |
| \s | Соответствие пробельным символам, в основном (\n, \f, \r, \t, \v) |
| \S | соответствует непробельным символам |
| \w | Соответствует любому символу слова (цифре, букве, подчеркиванию), эквивалентному [A-Za-z0-9_] |
| \W | соответствует любому символу, не являющемуся словом, в отличие от \w, эквивалентного [^a-za-z0-9_] |
3.3 Граничный класс
| код | иллюстрировать | Пример |
|---|---|---|
| ^ | соответствует началу строки | /^a/ соответствует «A», а не «An a» |
| $ | Соответствует концу строки | /a$/ соответствует «а», а не «а» |
| \b | соответствовать началу или концу слова | /\bno/ соответствует «нет» в слове «в полдень» |
3.4 Кванторные классы
| код | иллюстрировать |
|---|---|
| * | Повторить ноль или более раз |
| + | Повторите один или несколько раз (хотя бы один раз) |
| ? | Повторите ноль или один раз (необязательно) |
| {n} | повторить n раз |
| {n,m} | не менее n раз не более m раз |
| {n,} | не менее n раз |
3.5 Классы специальных символов
| код | иллюстрировать | Пример |
|---|---|---|
| / | Разделитель при объявлении регулярных выражений в литеральном режиме | /xxx/ |
| \ | Восстановление характерных символов регулярных выражений | ? соответствует предыдущему метасимволу 0 или 1 раз, /ba?/ будет соответствовать b,ba, а после \, "/ba\?"/ будет соответствовать только "ba?" |
| | | a|b соответствует строке, содержащей a или b | /ab|ba/ будет соответствовать ab,ba |
3.6 Захват и не захватывающие пакеты ()
- Capturegroup(x) соответствует x и фиксирует совпадение
Например: /(foo)/ соответствует и захватывает "foo" в "foo bar". Совпадающая подстрока может быть найдена в элементе [n] или в свойстве $n объекта RegExp.
"foo bar".match(/(foo)\s+bar/)
// ["foo bar", "foo"]
- Группа без захвата (?:x), соответствующая x, не фиксирует совпадение. Совпадения не могут быть снова доступны из результата
"foo bar".match(/(?:foo)\s+bar/)
// ["foo bar"]
"Приведенный выше пример выглядит так, будто группировка без захвата не кажется полезной, на самом деле она очень полезна Давайте рассмотрим следующий пример.
希望匹配字母,且字母之间可以为1或2时,但最终结果不需要中间的数字 只需要两边的字母
'abcd1j452h'.match(/[a-z]+(1|2)+([a-z]+)/);
["abcd1j", "1", "j"] //不使用非捕获分组 会把中间数字1也放入结果
'abcd1j452h'.match(/[a-z]+(?:1|2)+([a-z]+)/);
["abcd1j", "j"] //这样才完成需求
3.7 Жадные и нежадные режимы
Используйте жадный режим по умолчанию, чтобы сопоставить как можно больше
Добавьте знак «?» после повторяющегося квантификатора, чтобы использовать нежадный режим для кратчайшего возможного совпадения.
"1234567".match(/\d{2,5}/) //默认贪婪模式(尽可能匹配多) [12345]
"1234567".match(/\d{2,5}?/) //转成非贪婪模式 [12]
3.8 Прямой положительный поиск и прямой отрицательный просмотр
| код | иллюстрировать |
|---|---|
| x(?=y) | Совпадение x только в том случае, если за x сразу следует y. |
| x(?!y) | Совпадение x только в том случае, если за x не следует непосредственно y. |
const target = 'bg.png index.html app.js index.css test.png' //从以上字符串中找出以png结尾的文件名//不使用正向肯定查找的做法 target.match(/\b(\w+)\.png/g) //["bg.png", "test.png"] 我们只想要文件名 不想要.png后缀
使用正向肯定查找 target.match(/\b(\w+)(?=\.png)/g) // ["bg", "test"]
"Примечание: x(?=y) необходимо отличать от незахватывающей группы (?:) (написание очень похожее). Во-вторых, конечным результатом сопоставления x(?=y) является только x, но не y
4 Обычные атрибуты экземпляра
-
Включает ли RegExp.prototype.global глобальное сопоставление
-
RegExp.prototype.ignoreCase, следует ли игнорировать регистр символов
-
RegExp.prototype.lastIndex Позиция индекса строки, с которой начинается следующее совпадение
-
Включает ли RegExp.prototype.multiline многострочное сопоставление шаблонов (влияет на поведение ^ и $)
-
RegExp.prototype.source Исходный текст шаблона обычного объекта.
-
Включает ли RegExp.prototype.sticky липкое сопоставление
5 Регулярный пример метода
5.1 test
-
Синтаксис: regObj.test(str) выполняет поиск в строке
-
Возвращаемое значение: логическое значение. Проверяет, существует ли строка, соответствующая шаблону regObj в строке str, возвращает true, если она существует, и возвращает false, если она не существует.
"Использование очень простое, но есть подводные камни.Этот метод ведет себя иначе, когда обычный объект имеет глобальный атрибут (g).
Давайте сначала представим свойство lastIndex регулярного объекта LastIndex — это позиция, с которой регулярное выражение начинает совпадать при совпадении содержимого.
без глобального атрибута g
Из вышеизложенного видно: в начале совпадение начинается с нижнего индекса 0. Без g, сколько бы раз он ни выполнялся, свойство lastIndex обычного объекта остается неизменным.
с глобальным атрибутом g
Из приведенного выше видно: начало сопоставления начинается с нижнего индекса 0. После сопоставления свойство lastIndex обычного объекта будет автоматически изменено, и оно будет изменено на следующую позицию последнего символа совпадающего содержимого текущее выражение. До конца строки сбросьте lastIndex на 0. Видно, что один из них не совпалПоскольку при lastIndex равном 9 результат сопоставления отсутствует, следует отметить, что
5.2 exec
-
Синтаксис: regObj.exec(str) выполняет поиск в строке
-
Возвращаемое значение: null, если нет подходящего текста, иначе массив результатов:
Возвращаемый массив: первый элемент — это текст, соответствующий регулярному выражению; второй элемент — это текст, который соответствует первой группе захвата RegExpObject (если есть); третий элемент — это первый элемент, соответствующий RegExpObject. Две группы захвата совпадают. текст (если есть) и так далее.
"Этот метод ведет себя по-разному в зависимости от того, имеет ли обычный объект глобальный атрибут (g), и его производительность соответствует тесту
без г
с г
6 методов экземпляра строки
6.1 search
-
Синтаксис: str.search(reg) находит индекс первого совпадения
-
Возвращаемое значение: возвращает успешное совпадение первой позиции, если совпадения нет, возвращает -1
'abc'.search(/b/)
//1
6.2 split
-
Синтаксис: str.split(reg[maxLength]) Первый параметр может быть строкой или регулярным выражением, являющимся разделителем, второй параметр является необязательным и ограничивает максимальную длину возвращаемого массива.
-
Возвращаемое значение: массив
'abc-def_mno+xyz'.split(/[-_+]/, 3);
//["abc", "def", "mno"]
6.3 match
-
Синтаксис: str.match(reg) находит совпадение одного или нескольких регулярных выражений.
-
Возвращаемое значение: массив или ноль
"Этот метод ведет себя по-разному, если обычный объект имеет глобальный атрибут (g) или нет.
Когда вы не приносите G (только после того, как совпадение будет найдено, остановите возвращаемый результат, и метод exec будет согласованным)
var str='12a12b12c1111';
var reg=/\d+([a-z]+)/;
str.match(reg)
//["12a", "a", index: 0, input: "12a12b12c1111", groups: undefined]
С g (глобальный поиск возвращает массив, если найдена одна или несколько совпадающих строк — группы захвата отсутствуют)
var str='12a12b12c1111';
var reg=/\d+([a-z]+)/g;
str.match(reg)
//["12a", "12b", "12c"]
6.4 replace
-
Синтаксис: str.replace(reg/substr, newStr/function) Первый параметр может быть строкой или регулярным выражением, и его функция должна соответствовать. Второй параметр может быть строкой или функцией, и его роль — замена.
-
Возвращаемое значение: новая строка после замены, исходная строка остается неизменной
первый параметрэто строки и регулярные выраженияразницаДело в том, что регулярные выражения более выразительны и могут сопоставляться глобально. Поэтому, если параметр является строкой, может быть выполнена только одна замена.
'abc-xyz-abc'.replace('abc', 'biu'); // "biu-xyz-abc"
'abc-xyz-abc'.replace(/abc/g, 'biu'); // "biu-xyz-biu"
Второй параметрнитьВремя
Метод replace предоставляет некоторые специальные переменные для того, чтобы второй параметр был строкой, что может удовлетворить общие потребности.
Цифры $ представляют соответствующий порядок захвата групп. Обратите внимание, что хотя это переменная, не записывайте ее как строку шаблона.${$1}biu, внутренняя логика замены автоматически проанализирует строку и извлечет переменную.
var reg=/(\d{2})\/(\d{2})\/(\d{4})/
var str='09/05/2020'
var res=str.replace(reg,'$3-$2-$1') // 2020-05-09
Второй параметрфункцияВремя
В конце концов, на строковые переменные можно только ссылаться, и ими нельзя манипулировать. Напротив, функции гораздо более выразительны.
Возвращаемое значение функции — это то, что должно быть заменено. Если функция не имеет возвращаемого значения, она возвращает значение по умолчанию.undefined, поэтому замена не определена.
Давайте посмотрим на пример
var str='a1b2c3d4e'
var result=str.replace(/(\d)(\w)(\d)/g,(matchStr,group1,group2,group3,index,originStr)=>{
return group1+group3
}) //'a12c34e'
-
Первый параметр matchStr — это результат сопоставления.
-
Второй параметр и до предпоследнего параметра При наличии группы захвата последующие аргументы функции соответствуют группе захвата один к одному. Например, от group1 до group3 в нашем примере
-
Второй параметр предпоследний является положение соответствующего результата в тексте.
-
Последний параметр - исходный текст
хорошо, давайте проанализируем пример
-
Первый поиск соответствует '1b2'
-
Затем мы возвращаем group1+group3
-
group1 - первая группа захвата, равная 1
-
Group3 — третья группа захвата 2
-
Строка «1» + «2» равна «12»
-
Поэтому заменили «1b2» на 12.
-
Результат после первой замены: «a12».
-
Затем продолжите поиск в обратном направлении и замените «3d4» на «34».
-
Конечным результатом является «a12c34e».
7 Расширенное мышление
Очень важно терпеливо видеть, что принцип слишком скучен Ха-ха, давайте вернемся к началу исходного кода VUE - Анализ шаблона Вот что это значит.
/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
"Совет: Используйте свой мозг, чтобы подумать в течение нескольких минут. Если вы забыли соответствующие знания, вы можете поискать и найти их. Вы можете разделить и понять по скобкам.
Я действительно не могу думать об этом, пожалуйста, посмотритеИзучите регулярные выражения из разбора шаблонов vue
Группа передовых рыболовных технологий Brother Shark
Приветствую всех на технических биржахСвязь