Двойное закрепление регулярных выражений - PullRequest
2 голосов
/ 26 июля 2010

Я хочу принять произвольное регулярное выражение от пользователя и закрепить его с обеих сторон для обеспечения полного соответствия (^<user's-regex>$), однако я не знаю, должен ли я принимать во внимание тот факт, что пользовательвозможно, уже закрепил свое регулярное выражение.

Похоже, что Perl, C ++, .NET и JavaScript все позволяют double множественное закрепление.

"hello" =~ /^h/ # true
"hello" =~ /^^h/ # true
"hello" =~ /^^^h/ # true
"hello" =~ /e/ # true
"hello" =~ /^e/ # false
"hello" =~ /^^e/ # false

Кто-нибудь знает, задано ли это для работы таким образом?Могу ли я зависеть от этого поведения или это случайность, которая может измениться в будущем?


Редактировать: Причина, по которой нам это нужно, заключается в том, что мы используем регулярное выражение VBScript(из COM), мы используем match, однако это возвращает все совпадения, поэтому гораздо медленнее сопоставлять строку abc с .*a.*, чем с ^.*a.*$.Используя привязку, предложенную @ Tim , мы увеличиваем скорость совпадения (для длинных струн) более чем в 12 раз.

1 Ответ

4 голосов
/ 26 июля 2010

Вы можете зависеть от этого поведения. Движок регулярных выражений не возражает утверждать одно и то же один, два или сто раз подряд.

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

^(?: - пользовательское регулярное выражение - )$ или предпочтительно, если ваш вариант регулярного выражения позволяет это: \A(?: - пользовательское регулярное выражение - )\Z

В противном случае вы отключитесь, если пользователь использует чередование в своем регулярном выражении. Для сравнения:

user regex:         hello|bye
anchored regex:     ^hello|bye$      // alternation now affects anchors
correctly anchored: ^(?:hello|bye)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...