Регулярное выражение - New Regexp () Поиск/замена строки глобально

StackOverflow https://stackoverflow.com/questions/7313928

Вопрос

Я работаю над проектом, который на данный момент не может иметь какие -либо сторонние библиотеки 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() к пустой строке "" Чтобы избежать накопления космических символов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top