Чтобы клонировать регулярку, библиотека 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".
Ссылка на эту статью: