备注:学习笔记会反复修改更新
写一个文表格过滤功能,需要在搜索框里输入过滤字符,没输一个字符动态搜索一次,还要忽略大小写,以方便使用。这里搜索功能需要用到search()函数。
其实刚开始用的是indexOf()函数,但它只能搜索写死的字符串,不能动态识别大小写。查了下search() (W3C 说明 - search()), 它既可以搜索指定字符串,也就是indexOf()的功能,也可以搜索正则表达式,有点高级,于是我写了下面的代码:
// 定义一个关键字,字符串 userInputString 是用户动态输入的
var filter = userInputString;
// 在 SourceString 中搜索关键字 filter
var position = String(SourceString).search('/' + filter + '/i') ;
但发现不对,总是返回 -1。咦?这是哪里出了问题?于是又翻了翻说明(MDN 说明 - search() 函数),发现人家的正则表达式好像需要单独定义一个变量,于是又翻了翻正则表达式的说明(MDN 说明 - 正则表达式 RegExp)。原来JS里正则表达式要如下写才有效:
var re = /ab+c/i; // literal notation
var re = new RegExp('ab+c', 'i') // constructor with string pattern as first argument
var re = new RegExp(/ab+c/, 'i') // constructor with regular expression literal as first argument
re不带引号就对了,带了就错了,也就是说得是个正则变量,不能是字符串变量。所以,我把自己的代码改成了:
// 定义一个关键字,字符串 userInputString 是用户动态输入的
var filter = userInputString;
// 定义一个正则表达式变量re, 把filter 变成一个正则表达式。参数i表示忽略大小写。
let re = new RegExp(filter, 'i');
// 在 SourceString 中搜索关键字 re, 也就是filter
var position = String(SourceString).search(re);
然后就搜索成功了,消灭了返回值-1,哈哈~