在Javascript

时间:2017-06-19 12:00:15

标签: javascript regex performance

我有以下要求,其中输入的文字必须与以下任何允许的字符列表匹配, 使所有字符与reg exp模式不匹配。

  1. 0-9
  2. A-Z,A-Z
  3. 特殊字符如:

    1. 空间,@,-_及()' / * = :;
    2. 回车
    3. 行尾
    4. 我可以构建的正则表达式如下

      /[^a-zA-Z0-9\ \.@\,\r\n*=:;\-_\&()\'\/]/g
      

      对于给定的示例,请说input='123.@&-_()/*=:/\';#$%^"~!?[]av'。无效字符为'#$%^"~!?[]'

      以下是我获取不匹配字符的方法。

      1)构建如下所示的允许reg expn模式的否定。

      /^([a-zA-Z0-9\ \.@\,\r\n*=:;\-_\&()\'\/])/g(如果此reg exp是正确的,请更正吗?)

      2)使用替换功能获取所有字符

      var nomatch = '';        
      for (var index = 0; index < input.length; index++) {
          nomatch += input[index].replace(/^([a-zA-Z0-9\ \.@\,\r\n*=:;\-_\&()\'\/])/g, '');
      }
      
      so nomatch='#$%^"~!?[]' // finally
      

      但是这里的replace函数总是返回一个不匹配的字符。所以使用循环来获取所有。如果输入为100个字符,那么它将循环100次并且是不必要的。

      是否有更好的方法让所有字符与下面的行中的reg exp模式不匹配。

      1. 一个更好的正则表达式来获取不允许的字符(比我上面使用的reg exp的否定)?
      2. 避免不必要的循环?
      3. 单线方式?
      4. 非常感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:5)

您可以使用反向正则表达式简化它,并用空字符串替换所有允许的字符,以便输出只剩下不允许的字符。:

&#13;
&#13;
var re = /[\w .@,\r\n*=:;&()'\/-]+/g
var input = '123.@&-_()/*=:/\';#$%^"~!?[]av'

var input = input.replace(re, '')

console.log(input);
//=> "#$%^"~!?[]"
&#13;
&#13;
&#13;

另请注意,许多特殊字符不需要在字符类中进行转义。