【问题标题】:how to use Wildcard search in angularjs?如何在angularjs中使用通配符搜索?
【发布时间】:2026-01-11 02:10:01
【问题描述】:

我想实现通配符搜索。现在写我正在做的是:

var patt = new RegExp(input); 
if(patt.test(searchString))
    $scope.filteredModel.push(searchString);

但这并没有给出通配符搜索结果。即如果我输入v*,我应该得到所有以v 开头的字符串开始。但在这种情况下,由于我使用的是regExp,所以我得到了所有字符串(因为v* 表示v0 次或更多 次)。如何自定义?

【问题讨论】:

    标签: javascript regex angularjs filter wildcard


    【解决方案1】:

    如果您使用正则表达式,也许您可​​以尝试使用不同字符的简写版本。

    一些正则表达式的实现允许您对常用序列使用速记版本,它们是:

    \d,一个数字([0-9])

    \D,非数字([^0-9])

    \w,一个单词(字母数字)([a-zA-Z0-9])

    \W,一个非单词 ([^a-zA-Z0-9])

    \s,一个空格([ \t\n\r\f])

    \S,非空格([^ \t\n\r\f])

    Source

    【讨论】:

      【解决方案2】:

      您获取用户输入并将其转换为等效的通配符。 * 应该变成 .* 并且您应该在开头添加 ^ 以仅匹配以给定模式开头的内容:

      var patt = new RegExp('^' + input.replace(/\*/g, '.*'));
      

      现在您可以使用patt 进行测试并获得所需的结果。

      您可能还想转义正则表达式中的其他特殊字符:

      var specialCharacters = /([.\\+?[^\]$(){}=!<>|:-])/g;
      var patt = new RegExp('^' + input.replace(specialCharacters, "\\$1").replace(/\*/g, '.*'));
      

      这可能看起来很吓人,但它所做的只是在以下任何一个前面添加\. \ + ? [ ^ ] $ ( ) { } = ! &lt; &gt; | : -。这样,如果用户输入v*ABC+,它将尝试匹配以v 开头并以ABC+ 结尾的内容,而不是以ABC 和可变数量的Cs 结尾,例如ABCCCCCCC

      【讨论】:

      • 还有一个问题 .. 如何将所有出现的 * 替换为 .*
      • 我编辑了答案。将\g(global) 添加到正则表达式就可以了。