Регулярное выражение - New Regexp () Поиск/замена строки глобально
-
26-10-2019 - |
Вопрос
Я работаю над проектом, который на данный момент не может иметь какие -либо сторонние библиотеки JS (в противном случае это был бы бризом с jQuery). Одной из вещей в этом проекте является проверка формы. У меня это работает довольно хорошо, за исключением некоторых незначительных проблем с моей регуляцией.
Я запускаю функцию проверки OnChange () текстовых полей, поэтому, если вы вкладываете вклад, и есть ошибка, которую вы сразу узнаете. Вкладка с хорошими данными, и вы также узнаете немедленно. Если проверка не удастся, я назначаю ошибка класс для родительского элемента. Это работает нормально, если вы отправляете валидацию один раз. Если вы продолжаете сбой в тесте, классы ошибок накапливаются, например, если вы не пройдете проверку 2x, вы в конечном итоге получите:
<p class=" error">
Если вы потерпите неудачу в 3X, вы получите:
<p class=" error error">
Если проверка проходит, я вызову функцию removeClass () ниже. По сути, не похоже, что я получаю глобальный поиск/замену. Я наверняка подумал, что добавление глобального модификатора позаботится о приведенном выше случае, но это не так, это удаляет только один класс «ошибки».
removeClass: function (el, name) {
var regex = new RegExp('(^|\\s)' + name + '(\\s|$)', 'gi');
el.className = el.className.replace(regex, ' ');
}
Мое употребление повторной эксплуатации просто ищет начало линии или пробелов, за которым следуют «ошибка», за которым следует пробел или конец линии. Конечно, я по общему признанию отстой в регулярных выражениях :)
Что -нибудь выпрыгивает на тебя?
Решение
Он работает во всем мире, но когда будет найден матч, следующая попытка матча начинается с персонажа после последнего персонажа в предыдущем матче, который является e
во-вторых error
вместо места перед ним.
// v-----v-------first match
" error error"
// ^------continues here, no more matches because
// there isn't a space before `e`.
Чтобы проверить это, добавьте второе пространство между двумя классами, и оно будет работать.
// v-----v-------first match
" error error"
// ^------continues here, and now it will match
Исправление было бы использовать \\b
Вместо этого, который не соответствует ни одному персонажу, поэтому следующий матч начнется после последнего r
персонаж в предыдущем error
соответствие.
new RegExp('\\b' + name + '\\b', 'gi');
Как отмечено @Joseph, вы должны изменить " "
в .replace()
к пустой строке ""
Чтобы избежать накопления космических символов.