Как превратить введенное пользователем значение в регулярное выражение, не путаясь со специальными символами? - PullRequest
1 голос
/ 30 ноября 2011

Я возился с MongoDB, и я наткнулся на кое-что. Я хотел бы сделать простое приложение, в котором пользователь может искать все документы в коллекции, получая документы, в которых ключ username содержит определенное введенное пользователем значение.

Для реализации «содержит» его появляется можно использовать регулярное выражение. Это прекрасно работает, но как я могу преобразовать пользовательский ввод в регулярное выражение? Проблема в том, что просто делаешь ...

new RegExp(value);

... не работает из-за специальных символов (например, (, [ и т. Д.). Это означает, что пользователь не может выполнить запрос, содержащий ( таким образом.

Я думал, что спасение от всего сделает работу:

new RegExp(value.replace(/./g, function(x) {
    return "\\" + x;
});

... но это не так, потому что некоторые экранированные символы также являются особыми (например, \d), поэтому не специальные символы становятся специальными.

Я немного растерялся, как я мог превратить введенное пользователем значение в регулярное выражение. Или, возможно, есть лучший способ сделать запрос для всех документов, ключ которых содержит определенное значение, введенное пользователем?

1 Ответ

2 голосов
/ 01 декабря 2011

Реализация:

На основе этого источника .

var oldText = "[hello, world :) ]";
var sre = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g');
var newText = oldText.replace(sre, '\\$1'); // "\[hello, world :\) \]"

Дальнейшее объяснение:

sre - это регулярное выражение, которое соответствует всем возможным специальным символам и использует скобки, поэтому оно может ссылаться на совпадающие части.

Неполный sre пример:

/(\/|\.|\\)/g 

Эта попытка будет соответствовать любому из следующих символов: "/", "."а также "\".Использование затем

text.replace(sre, '\\$1');

приведет к экранированию каждого совпадающего символа в тексте с "\".Так что это заменит "."с "\." и т. д.

...