Регулярное выражение JavaScript для сопоставления строк с использованием подстановочных знаков * и?

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть список имен, и мне нужна функция, позволяющая пользователю фильтровать их с использованием подстановочных знаков * и ? (любая строка и любой символ.) Я знаю, что мне нужно очистить пользовательский ввод, чтобы избежать синтаксических инъекций (преднамеренных или случайных), но я не знаю, сколько мне нужно будет очистить.

Для чего мне нужно заменить * и? из пользовательского ввода?

 var names = [...];
var userInput = field.value;

/* Replace * and ? for their equivalent in regexp */
userInput = userInput.replaceAll(...);
userInput = userInput.replaceAll(...);

 /* clean the input */
userInput = userInput.replaceAll(...);
userInput = userInput.replaceAll(...);
...

var regex = new Regexp(userInput);

var matches = [];
for (name in names) {
    if (regex.test(name)) {
        matches.push(name);
    }
}

/* Show the results */
  

Спасибо.

Ответ №1:

 function globToRegex (glob) {
    var specialChars = "\^$* ?.()|{}[]";
    var regexChars = ["^"];
    for (var i = 0; i < glob.length;   i) {
        var c = glob.charAt(i);
        switch (c) {
            case '?':
                regexChars.push(".");
                break;
            case '*':
                regexChars.push(".*");
                break;
            default:
                if (specialChars.indexOf(c) >= 0) {
                    regexChars.push("\");
                }
                regexChars.push(c);
        }
    }
    regexChars.push("$");
    return new RegExp(regexChars.join(""));
}
  

Комментарии:

1. Спасибо за публикацию этого метода. Я просто расширил его для необязательной нечувствительности к регистру, поэтому мои последние две строки гласят: if (нечувствительный) { modifiers = ‘i’}; возвращает новое регулярное выражение(regexChars.join(«»),модификаторы);

Ответ №2:

Хм, я действительно не думаю, что здесь нужно что-то чистить. Если пользователь не введет допустимое регулярное выражение, new RegExp(userInput) произойдет сбой, оно никогда не будет eval() соответствовать строке.