Как клонировать обычную?

JavaScript регулярное выражение

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


Ссылка на эту статью:

cloneRegExp.js

Как Lodash внедряет глубокое копирование Develop Paper