18

我想在 ng-repeat 中使用正则表达式。我已经尝试了以下代码,但它不起作用。

<div ng-repeat="user in users | filter:{'type':/^c5$/}"></div>

我有用户数组,我只想显示类型为 c5 的用户。

如果我使用

filter:{'type':'c5'} 

然后它也显示类型为“ac5x”的用户,因为它包含c5。

我怎么解决这个问题?也许还有另一种解决方案。

谢谢你!

4

5 回答 5

36

什么 tosh 提到应该对你有用!

如果您发现自己想要更频繁地通过正则表达式进行过滤,您可以创建一个自定义过滤器。像这个小提琴这样的东西会让你指定一个字段来检查正则表达式:

var myApp = angular.module('myApp', []);
myApp.filter('regex', function() {
  return function(input, field, regex) {
      var patt = new RegExp(regex);      
      var out = [];
      for (var i = 0; i < input.length; i++){
          if(patt.test(input[i][field]))
              out.push(input[i]);
      }      
    return out;
  };
});

像这样使用 where'type'表示您正在检查的字段(在这种情况下是一个名为 type 的字段):

<div ng-repeat="user in users | regex:'type':'^c5$'"></div>
于 2012-08-21T01:07:16.193 回答
16

您可以在过滤器表达式中使用函数。所以基本上,您可以使用 javascript 进行任何可能的过滤。

<li ng-repeat="name in names | filter:myFilter"> {{ name }}

在控制器中:

$scope.myFilter = function(user) {
   return /^c5$/.test(user.type);
};
于 2012-08-21T00:43:34.217 回答
1

Gloopy 的答案是正确的。我在我的网站中实现了它,但我收到了一个错误:

'input' is undefined

发生这种情况是因为我有时什么都没有循环。我通过添加一个条件来解决这个问题,如果未定义则返回空out数组。input

var myApp = angular.module('myApp', []);
myApp.filter('regex', function() {
  return function(input, field, regex) {
      var patt = new RegExp(regex);      
      var out = [];

      if(input === undefined) {
          return out;
      }

      for (var i = 0; i < input.length; i++){
          if(patt.test(input[i][field]))
              out.push(input[i]);
      }      
    return out;
  };
});

希望这对可能遇到同样问题的人有所帮助。

于 2015-04-15T12:01:23.600 回答
1

正则表达式确实很强大,可以处理各种匹配,包括精确匹配,例如^c5$.

但是,此问题的正文表明,该问题将通过始终按完全匹配过滤来解决。

您可以通过将第三个参数设置为:指定 Angular 过滤器应使用精确匹配true比较器:

filter:{type:'c5'}:true
于 2017-02-02T03:40:03.857 回答
0

感谢正则表达式过滤器的想法,但以前的解决方案不适用于一般情况,例如多级字段的对象情况。

例如:

<div ng-repeat="item in workers | regex:'meta.fullname.name':'^[r|R]' ">

我的解决方案是:

.filter('regex', function() {
  return function(input, field, regex) {
    var f, fields, i, j, out, patt;
    if (input != null) {
      patt = new RegExp(regex);
      i = 0;
      out = [];
      while (i < input.length) {
        fields = field.split('.').reverse();
        j = input[i];
        while (fields.length > 0) {
          f = fields.pop();
          j = j[f];
        }
        if (patt.test(j)) {
          out.push(input[i]);
        }
        i++;
      }
      return out;
    }
  };
});

它适用于仅具有一级属性的多级对象或简单对象。

迟到了,但希望它可以帮助您从不同的角度看待。

这是 CoffeeScript 中的代码,更简洁:

angular.module('yourApp')
    .filter 'regex', ->
        (input, field, regex) ->
            if input?
                patt = new RegExp(regex)
                i = 0
                out = []
                while i < input.length
                    fields = field.split('.').reverse()
                    j = input[i]
                    while fields.length > 0
                        f = fields.pop()
                        j = j[f]
                    if patt.test(j)
                        out.push input[i]
                    i++
                return out
于 2015-09-30T00:09:51.857 回答