Как ограничить строку определенным набором символов в JavaScript?

Чтобы поместить это в контекст, рассмотрим эти 2 функции:

ml_RestrictToChars = function(input,regex) {
    var result = '';var c = '';
    var rx = new RegExp(regex);
    for (var i = 0; i < input.length; i++) {
        c = input.charAt(i);
        if (rx.test(c)) {
            result += c;
        }
    }
    return result;
};
ml_OmitChars = function(input,regex) {
    var rx = new RegExp(regex,'g');
    return input.replace(rx,''); 
};

Первая функция будет ограничивать ввод определенным набором символов, вторая будет пропускать любой символ или последовательность символов из ввода. Как видно из кода в первой функции, он будет функционировать только в том случае, если в аргумент 'regex' передается один символьный класс, поскольку код включения проверяет только символы по одному за раз.

Рассмотрим входную строку 12-34прямо сейчас, если я передам регулярное выражение '[0-9]' к первой функции и '[^0-9]' ко второй функции я получу такой же вывод, как и ожидалось: 1234

Однако, если я использую более сложное выражение во второй функции, такой как '[^0-9][^0-9]-'Я получу выход 12-, Но если я передам более чем один символьный класс первой функции, она вернет пустую строку.

Что мне интересно, так это если есть простой способ (желательно без зацикливания) сделать инверсию ml_OmitChars, чтобы они работали аналогично?

1 ответ

Решение

Соответствие каждому символу простое (но медленное), и вы показываете, как это работает. Теперь вы хотите сопоставить шаблон и объединить все совпадения. Это сделано так:

ml_RestrictToChars = function(input,regex) {
    var rx = new RegExp (regex, 'g');
    var matches = input.match (rx);
    return matches.join ('');
};

Первая строка делает его "глобальным" регулярным выражением, которое меняет поведение match(). Вторая строка возвращает все совпадения в массиве, а последняя строка объединяет их в одну строку и возвращает ее.

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