我正在开发一个目前无法拥有任何第三方JS库的项目(否则这将是一个轻而易举的jQuery)。该项目中的一件事是表单验证。除了我的正则表达式的一些小问题之外,我的工作相当不错。
我正在触发文本字段的onchange()验证功能,所以如果你选中并且出现错误,你会立即知道。选择好的数据,你也会马上知道。如果验证失败,我将错误类分配给父元素。如果您只进行一次验证,这可以正常工作。如果你继续测试失败,那么错误类就会累积起来,例如,如果验证失败2x,你最终会得到:
<p class=" error">
如果你失败了3倍,你最终会得到:
<p class=" error error">
如果验证通过,我调用下面的removeClass()函数。基本上,它看起来不像我正在进行全局搜索/替换。我确信添加全局修饰符会处理上面的情况,但它没有,它只删除一个“错误”类。
removeClass: function (el, name) {
var regex = new RegExp('(^|\\s)' + name + '(\\s|$)', 'gi');
el.className = el.className.replace(regex, ' ');
}
我的正则表达式只是寻找行或空格的开头,然后是“错误”,后跟空格或行尾。诚然,我承认正常的表达方式很糟糕:)
有什么东西跳出来吗?
答案 0 :(得分:3)
它在全球范围内工作,但是当找到匹配项时,下一个尝试的匹配开始于上一个匹配中最后一个字符后面的字符,即第二个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
字符后开始。< / p>
new RegExp('\\b' + name + '\\b', 'gi');
正如@Joseph所述,您应该将" "
中的.replace()
更改为空字符串""
,以避免空格字符的累积。