正则表达式 - 新的RegExp()全局搜索/替换字符串

时间:2011-09-06 00:39:22

标签: javascript regex replace classname

我正在开发一个目前无法拥有任何第三方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, ' ');
}

我的正则表达式只是寻找行或空格的开头,然后是“错误”,后跟空格或行尾。诚然,我承认正常的表达方式很糟糕:)

有什么东西跳出来吗?

1 个答案:

答案 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()更改为空字符串"",以避免空格字符的累积。