Javascript: какой смысл в RegExp.compile ()? - PullRequest
50 голосов
/ 20 мая 2009

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

Ответы [ 4 ]

86 голосов
/ 20 мая 2009

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

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

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

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

var regexp = new RegExp("pattern");
regexp = new RegExp("new pattern");
6 голосов
/ 08 марта 2011

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

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

4 голосов
/ 03 ноября 2016

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

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") )
3 голосов
/ 20 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...