Как ограничить строку определенным набором символов в JavaScript? - PullRequest
2 голосов
/ 08 сентября 2010

Чтобы поместить это в контекст, рассмотрим следующие 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 Ответ

1 голос
/ 24 ноября 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...