У меня есть ситуация, когда я хочу получить регулярное выражение от пользователя и запустить его с несколькими тысячами строк ввода. В руководстве я обнаружил, что объект RegExp
имеет метод .compile()
, который используется для ускорения работы в таких случаях. Но зачем мне снова передавать строку регулярного выражения, если я уже передал их в конструкторе? Может быть, конструктор сам compile()
?
Javascript: что точка RegExp.compile()?
Ответ 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") )