获取与Javascript中的Reg表达式模式不匹配的所有字符

use*_*040 4 javascript regex performance

我有以下要求,其中输入的文本必须匹配以下任何允许的字符列表,并获得所有不匹配reg exp模式的字符.

  1. 0-9
  2. 包括AZ,az

和特殊字符如:

  1. 空间,.@,-_&()'/*= :;
  2. 回车
  3. 行结束

我可以构建的正则表达式如下

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

举个例子,比如说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
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 一个更好的正则表达式来获取不允许的字符(比我上面使用的reg exp的否定)?
  2. 避免不必要的循环?
  3. 单线方法?

非常感谢您对此提供任何帮助.

anu*_*ava 5

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

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

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

console.log(input);
//=> "#$%^"~!?[]"
Run Code Online (Sandbox Code Playgroud)

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