Как ограничить строку определенным набором символов в 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(). Вторая строка возвращает все совпадения в массиве, а последняя строка объединяет их в одну строку и возвращает ее.