Чтобы клонировать регулярку, библиотека Lodash реализует это следующим образом:
const reFlags = /\w*$/
function cloneRegExp(regexp) {
const result = new regexp.constructor(regexp.source, reFlags.exec(regexp))
result.lastIndex = regexp.lastIndex
return result
}
cloneRegExp(/xyz/gim)
// => /xyz/gim
Через этот код, кстати, рассмотримJS
Частичное знание обычных объектов.
1. Конструктор
первый,regexp.constructor
то естьRegExp
.
К пониманиюJS
Если у вас есть знания о прототипах, это должно быть хорошо.
Конкретно,/xyz/gim
является обычным литералом, является конструкторомRegExp
пример./xyz/gim
Выбиратьconstructor
При использовании атрибута по принципу цепочки прототипов, если сам объект не имеет этого атрибута, он должен обратиться к своему прототипу, чтобы найти его. а также/xyz/gim
ПрототипRegExp.prototype
. в то же времяRegExp.prototype.constructor
точноRegExp
сам.
КонструкторRexExp
Типичное использование:
var regexp = new RegExp('xyz', 'gim');
// 等价于
var regexp = /xyz/gim;
2. Обычная композиция экземпляра
Обычный объект можно условно разделить на две части: исходный код (source) и модификатор (flags). Например,/xyz/gim
изsource
да"xyz"
, в то время как егоflags
да"gim"
.
var regexp = /xyz/gim
regexp.source
// => "xyz"
regexp.flags
// => "gim"
Еще пару слов о модификаторах. существуетJS
, на данный момент всего6
модификаторы:g
,i
,m
,s
,u
,y
. Когда обычный объект преобразуется в строку, его модификаторы сортируются в алфавитном порядке.
var regexp = /xyz/imgyus;
regexp.flags
// => "gimsuy"
regexp.toString()
// => "/xyz/gimsuy"
Исходный код Лодаша, время на получение модификатора не проходитflags
, вместо обычного извлечения:
/\w*$/.exec(regexp.toString()).toString()
// => gim
Среди них регулярный/\w*$/
Соответствует букве в конце строки. Поскольку целевое регулярное выражение может не иметь модификаторов, квантификатор здесь*
.
Я думаю, вы видели это. Да, в следующем коде есть два преобразования типов (в строки):
new regexp.constructor(regexp.source, reFlags.exec(regexp))
3.lastIndex можно изменить
Когда клон обычный, также клонируйте егоlastIndex
. Узнал это!
lastIndex
Указывает начальную позицию каждого матча.
с помощью обычных объектовtest
а такжеexec
метод, и когда модификаторg
илиy
когда, даlastIndex
является влиятельным.
Например:
var regexp = /\d/g;
regexp.lastIndex
// => 0
regexp.test("123")
// => true
regexp.lastIndex
// => 1
regexp.test("1")
// => false
первый1
второсортныйtest
При вводе строки"123"
соответствует первой цифре в"1"
.lastIndex
Это также стало1
, указывая, что следующая совпадающая позиция пропустит первую0
немного, прямо из1
немного начало.
первый2
второсортныйtest
В настоящее время введите строку"1"
, только один символ, первый1
Бит пуст, поэтому совпадение не удается. В настоящее времяlastIndex
сбросится на0
.
Самое главное,lastIndex
Свойства доступны не только для чтения, но и для записи:
var regexp = /\d/g;
regexp.lastIndex = 3
regexp.test("123")
// => false
На данный момент реализация lodash должна быть полностью понятна:
const reFlags = /\w*$/
function cloneRegExp(regexp) {
const result = new regexp.constructor(regexp.source, reFlags.exec(regexp))
result.lastIndex = regexp.lastIndex
return result
}
cloneRegExp(/xyz/gim)
// => /xyz/gim
Эта статья закончилась.
добро пожаловать на чтение"Обычная мини-книга JS".
Ссылка на эту статью: