我想实现通配符搜索。现在写下我正在做的是:
var patt = new RegExp(input);
if(patt.test(searchString))
$scope.filteredModel.push(searchString);
但是这不会给出通配符搜索结果。即如果我输入v*
,我应该使用v
获取开始的所有字符串。但在这种情况下,当我使用regExp
时,我会收到所有字符串(因为v*
表示 0或更多出现v
)。我该如何定制?
答案 0 :(得分:2)
您获取用户输入并将其转换为此通配符等效项。 *
应该变为.*
,您应该在开头添加^
,以便仅匹配以给定模式开头的内容:
var patt = new RegExp('^' + input.replace(/\*/g, '.*'));
现在您可以使用patt
进行测试并获得所需的结果。
此外,您可能想要转义正则表达式中的其他特殊字符:
var specialCharacters = /([.\\+?[^\]$(){}=!<>|:-])/g;
var patt = new RegExp('^' + input.replace(specialCharacters, "\\$1").replace(/\*/g, '.*'));
这可能看起来很可怕,但它所做的只是在前面添加\
:. \ + ? [ ^ ] $ ( ) { } = ! < > | : -
。这样,如果用户输入v*ABC+
,它将尝试匹配以v
开头并以ABC+
结尾的内容,而不是以ABC
和{{1}的可变数字结尾像C
一样。
答案 1 :(得分:0)
如果您正在使用正则表达式,也许您可以尝试使用不同字符的短手版本。
正则表达式的某些实现允许您使用常用序列的简写版本,它们是:
\ d,一个数字([0-9])
\ D,非数字([^ 0-9])
\ w,一个单词(字母数字)([a-zA-Z0-9])
\ W,非单词([^ a-zA-Z0-9])
\ s,一个空格([\ t \ n \ r \ n \ f])
\ S,非空格([^ \ t \ n \ r \ n \ f])