Регулярное выражение - новая RegExp () ищет / заменяет строку глобально - PullRequest
2 голосов
/ 06 сентября 2011

Я работаю над проектом, который на данный момент не может иметь каких-либо сторонних JS-библиотек (в противном случае это будет проще простого с jQuery). Одна из вещей в этом проекте - проверка формы. У меня это работает довольно хорошо, за исключением некоторых мелких проблем с моим регулярным выражением.

Я запускаю функцию проверки onchange () текстовых полей, так что если вы перейдете на другую страницу и сразу же обнаружите ошибку. Перейдите с хорошими данными, и вы сразу узнаете. Если проверка не пройдена, я назначаю родительский элемент error class. Это прекрасно работает, если вы отключите проверку только один раз. Если вы продолжаете проваливать тест, классы ошибок накапливаются, например, если вы проваливаете проверку 2x, вы получите:

<p class=" error">

Если вы ошибетесь 3 раза, вы получите:

<p class=" error error">

Если проверка прошла успешно, я вызываю функцию removeClass () ниже. По сути, не похоже, что я получаю глобальный поиск / замену. Я думал наверняка, что добавление глобального модификатора позаботится о вышеописанном случае, но это не так, он удаляет только один класс «error».

removeClass: function (el, name) {
    var regex = new RegExp('(^|\\s)' + name + '(\\s|$)', 'gi');
    el.className = el.className.replace(regex, ' ');
}

Мое регулярное выражение просто ищет начало строки или пробела, за которыми следует «ошибка», за которой следуют пробел или конец строки. Согласен, я, правда, сосу регулярные выражения :)

Что-нибудь выпрыгнуло на тебя?

1 Ответ

3 голосов
/ 06 сентября 2011

Это работает глобально, но когда совпадение найдено, следующая попытка совпадения начинается с символа, следующего за последним символом в предыдущем сопоставлении, то есть 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');

Как отметил @ Джозеф , вы должны изменить " " в .replace() на пустую строку "", чтобы избежать накопления пробелов.

...