Регулярное сопоставление местоположения
Сначала поймите следующие понятия
-
Нулевая ширина: соответствует только позиции.В процессе сопоставления не занимает символы, поэтому называется нулевой шириной
-
Упреждающий просмотр: когда обычный движок сканирует символы, он сканирует слева направо, сопоставляя символы, которые не были отсканированы указателем сканирования, до указателя, поэтому он называется упреждающим просмотром.
-
Следующая строка: соответствует символу, который был просканирован указателем, а затем достигает символа после указателя, поэтому он называется следующей строкой, то есть генерируется возврат
-
Вперед: то есть сопоставить выражение в скобках
-
Отрицательный: не соответствует выражениям в круглых скобках
es5 поддерживает утверждения с опережением
es2018 поддерживает только ретроспективные утверждения
Утверждение положительного просмотра нулевой ширины, также известное как положительный просмотр
Уведомление:
.
В обычном случае это означает соответствие любому символу, кроме нескольких пробельных символов, таких как перевод строки, возврат каретки и т. д., и его необходимо экранировать при сопоставлении.
regexp(?=pattern): последовательность символов сразу после строки, совпадающей с regexp, должна соответствовать шаблону
пример:
`sinM.`.match(/sin(?=M\.)/g); // ["sin"]
`M.sin`.match(/sin(?=M\.)/g); // null
Первый sin будет совпадать, потому что за ним следует шаблон
Утверждение отрицательного просмотра нулевой ширины, также известное как отрицательный просмотр
регулярное выражение (?! шаблон): последовательность символов сразу после строки, совпадающей с регулярным выражением, не может соответствовать шаблону.
пример:
`M.sin`.match(/sin(?!M\.)/g); // ["sin"]
`sinM.`.match(/sin(?!M\.)/g); // null
Первый грех совпадет, потому что после него нет шаблона.
Положительное убийство с нулевой шириной, также известное как позитивный взгляд
(?
пример:
'sinM.'.match(/(?<=M\.)sin/g); // null
'M.sin'.match(/(?<=M\.)sin/g); // ["sin"]
Второй sin будет совпадать, потому что ему предшествует шаблон
Утверждение отрицательного просмотра назад нулевой ширины, также известное как отрицательный просмотр назад
(?
пример:
'sinM.'.match(/(?<!M\.)sin/g); // ["sin"]
'M.sin'.match(/(?<!M\.)sin/g); // null
Первый грех совпадет, потому что перед ним нет шаблона.
Для практического примера положите4+6*sqrt(5)*Math.sqrt(5)
можно преобразовать вeval
илиnew Function()
строка для получения фактического результата
Это можно подтвердить с помощью отрицательного просмотра назад, то есть замены последовательностей строк sqrt, которым непосредственно не предшествует Math.
let s = `4+6*sqrt(5)*Math.sqrt(5)`.replace(/(?<!Math\.)sqrt/g, func => `Math.${func}`);
eval(s); // 34
Второй пример: сопоставьте путь после URL-адреса
'https://www.google.com/v3/api/getUser?user=panghu'.match(/(?<=\.\w*(?=\/)).*/);
Третий пример: ширина тега img в строке замены равна 100%
'<img id = "23" style="width:999x;"/><img id = "23" style="width:999x;"/>'.replace(
/(?<=(<img[\s\S]*width:\s*))[^("\/);]*/gm,
'100%'
);
соответствовать греху
'M.sin'.match(/(?<=M\.)sin/g); // ["sin"]
`M.sin`.match(/sin(?!M\.)/g); // ["sin"]
Оба метода могут дать одинаковый эффект, но я лично предпочитаю использовать первый метод, который больше соответствует привычкам прямого мышления людей.
«странный» результат обычного метода тестирования с глобальным модификатором соответствия g
Давайте посмотрим на результаты следующих двух строк кода.
let reg = /js/g;
reg.test('js'); //before: lastIndex:0, after: lastIndex:2
reg.test('js'); //before: lastIndex:2, after: lastIndex:0
reg.test('js'); //before: lastIndex:0, after: lastIndex:2
Если ваш ответ три верно, вы ошибаетесь Ответ на самом деле истинный, ложный, истинный, и это то, что называется странностью.
Почему? отвечать:Объект REGEXP имеет свойство LASTINDEX, исходное значение которого 0, Когда модификатор G не используется, он будет автоматически установлен на 0 после каждого выполнения метода теста При использовании модификатора G выполняется при каждом выполнении метода теста, он начинает совпадать с позиции с указательным значением LASTINDEX, которое является следующим индексом значения последовательности символов. Установите LASTINDEX на 0, только если соответствует неудачному
Пример: перед выполнением первого тестового метода в приведенном выше примере значение lastIndex равно 0, а после выполнения значение lastIndex равно 2, поэтому, когда тестовый метод выполняется во второй раз, он начинает совпадать со строки значение индекса 2, которое, очевидно, будет соответствовать Failed, поэтому третье совпадение снова будет успешным
сопоставляет теги с корнем класса (независимо от особых случаев), например<div class="root">
Очки знаний, которые могут быть здесь задействованы, следующие:жадное/нежадное сопоставление,сопоставление с образцом,Бэктрекинг и его устранение,группировка,обратная ссылка
Базовая версия: соответствует только классам, заключенным в двойные кавычки.
`<div class="root"><span class="root"></span><i class='root'></i></div>`.match(/<[^>]*class="root".*?>/g);
// ["<div class="root">", "<span class="root">"]
сопоставление с образцом[^>]
означает совпадение, кроме[^]
Все символы внутри, вот совпадение, кроме>
все персонажи, кроме
Заметили потребность в нежадных совпадающих символах как до, так и после? Иначе только фронт, он жадно съест div, только зад, жадно съест span
Полная версия: Можно сопоставлять классы, заключенные в одинарные и двойные кавычки
`<div class="root"><span class="root"></span><i class='root'></i></div>`.match(/<[^>]*class=("root"|'root').*?>/g);
// ["<div class="root">", "<span class="root">", "<i class='root'>"]
Вот если не использовать[^>]
при использовании.*
Появится следующий результат сопоставления, а это не то, что нам нужно.
["<div class="root">", "<span class="root">", "</span><i class='root'>"]
РАСШИРЕННАЯ ВЕРСИЯ: используйте сгруппированные ссылки для устранения неприглядных("root"|'root')
, затем удалите.*?
отступление
`<div class="root"><span class="root"></span><i class='root'></i></div>`.match(/<[^>]*class=("|')root\1[^>]*>/g);
// ["<div class="root">", "<span class="root">", "<i class='root'>"]
\1
Указывает, что указан первый сгруппированный результат перед ссылкой, т.е.("|')
Результат сопоставления, чтобы он мог гарантировать, что одинарные кавычки соответствуют одинарным кавычкам, а двойные кавычки соответствуют двойным кавычкам.
[^>]*
заменять.*?
можно устранить с помощью*?
Ретрогрант из-за*
максимально возможное количество совпадений, в то время как?
как можно меньше совпадений
Оглядываясь назад в начале, я сказал о частном случае, что значение атрибута тега не может содержать>
, потому что для устранения возврата используйте[^>]
Содержит символ >, эта часть фактически может быть заменена другими регулярными значениями, так что она может соответствовать особым случаям без возврата.
Если все правыСоответствует тегам с классом rootЕсли вас интересуют знания, задействованные в этой части, вы можете прокомментировать ниже, и я подробно расскажу об этом, когда придет время.
Если вам понравилась эта статья, пожалуйста, нажмите ⭐исходный адреспод фарфор
Ссылаться на:
Полное руководство по JavaScript (6-е издание)
JavaScript регулярное выражение мини-книги
Если в вышеизложенном есть ошибки, поправьте меня