Улучшите этот рекурсивный поиск с помощью Regex

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

String.prototype.replaceArray = function(find, replace) {
        var replaceString = this;
        for (var i = 0; i < find.length; i++) {
            replaceString = replaceString.replace(find[i], replace[i]);
        }
        return replaceString;
    };

var match = [
                    '\\',
                    '+',
                    '-',
                    '&',
                    '|',
                    '!',
                    '(',
                    ')',
                    '{',
                    '}',
                    '[',
                    ']',
                    '^',
                    '~',
                    '*',
                    '?',
                    ':',
                    '"',
                    ';',
                    ' '
                ];        
                var replace = [
                    '\\\\',
                    '\\+',
                    '\\-',
                    '\\&',
                    '\\|',
                    '\\!',
                    '\\(',
                    '\\)',
                    '\\{',
                    '\\}',
                    '\\[',
                    '\\]',
                    '\\^',
                    '\\~',
                    '\\*',
                    '\\?',
                    '\\:',
                    '\\"',
                    '\\;',
                    '\\ '
                ];                    
                _.map(object, function (field) {
                    field.replaceArray(match, replace);
                });

Может ли существовать способ использовать Regex?

Я пытался заменить

field.replaceArray(match, replace);

к этому

field.replace(/([\\+-&|!(){}[]^~*?:";])/g, '\\$1');

но это не работает, вероятно, потому что я недостаточно понимаю, как работает Regex:(

1 ответ

Решение

Вы должны избежать квадратных скобок. Также поставьте дефис в конце, потому что на втором месте он указывает диапазон:

field.replace(/([\\+&|!(){}\[\]^~*?:"; -])/g, '\\$1');

тестер регулярных выражений

Другие вопросы по тегам