Javascript: что точка RegExp.compile()? - программирование
Подтвердить что ты не робот

Javascript: что точка RegExp.compile()?

У меня есть ситуация, когда я хочу получить регулярное выражение от пользователя и запустить его с несколькими тысячами строк ввода. В руководстве я обнаружил, что объект RegExp имеет метод .compile(), который используется для ускорения работы в таких случаях. Но зачем мне снова передавать строку регулярного выражения, если я уже передал их в конструкторе? Может быть, конструктор сам compile()?

4b9b3361

Ответ 1

Метод RegExp().compile() устарел. Это в основном то же самое, что и конструктор, который, как я полагаю, является причиной его устаревания. Вы должны использовать только конструктор в настоящее время.

Другими словами, вы могли это сделать:

var regexp = new RegExp("pattern");
regexp.compile("new pattern");

Но в наши дни он не отличается от простого вызова:

var regexp = new RegExp("pattern");
regexp = new RegExp("new pattern");

Ответ 2

И с Opera 11 запуск RegExp.compile() приведет к ошибкам.

Очевидно, что когда Opera "компилирует" регулярное выражение, оно обертывает строку re.source в косых чертах (например, re.source == "^(.)" становится "/^(.)/"). Если вы вручную скомпилируете регулярное выражение, Opera не распознает этот факт и идет вперед и снова компилирует его (re.source становится "//^(.)//"). Каждый компилятор приводит к дополнительному набору косых черт, который изменяет значение регулярного выражения и приводит к ошибкам.

Ответ 3

Насколько я могу сказать, все RegExp.compile делает замену базового регулярного выражения объекта RegExp. Я думаю, что компиляция, возможно, имела ценность в прошлом, но все современные JS-движки "компилируют" регулярное выражение для первого вызова и кеша, которые "скомпилировали" версию.

Ответ 4

Сначала вы должны скомпилировать свое регулярное выражение, чтобы использовать его, если вы используете /, попробуйте это:

var regex=new RegExp('/[a-zA-Z]/')

console.log("not compiled with escape /", regex.test("ciao") )

regex.compile()

console.log("compiled", regex.test("ciao") )

var regex=new RegExp('[a-zA-Z]')

console.log("not compiled, but no escape /", regex.test("ciao") )