javascript - Angular 中的正则表达式通配符

标签 javascript angularjs regex wildcard

http://jsfiddle.net/f4Zkm/213/

HTML

<div ng-app>
    <div ng-controller="MyController">
        <input type="search" ng-model="search" placeholder="Search...">
        <ul>
            <li ng-repeat="name in names | filter:filterBySearch">
                {{ name }}
            </li>
        </ul>
    </div>
</div>

app.js

function escapeRegExp(string){
    return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
function MyController($scope) {
    $scope.names = [
    'Lolita Dipietro',
    'Annice Guernsey',
    'Gerri Rall',
    'Ginette Pinales',
    'Lon Rondon',
    'Jennine Marcos',
    'Roxann Hooser',
    'Brendon Loth',
    'Ilda Bogdan',
    'Jani Fan',
    'Grace Soller',
    'Everette Costantino',
    'Andy Hume',
    'Omar Davie',
    'Jerrica Hillery',
    'Charline Cogar',
    'Melda Diorio',
    'Rita Abbott',
    'Setsuko Minger',
    'Aretha Paige'];

    $scope.search = '';
    var regex;
    $scope.$watch('search', function (value) {
        regex = new RegExp('\\b' + escapeRegExp(value), 'i');
    });

    $scope.filterBySearch = function(name) {
        if (!$scope.search) return true;
        return regex.test(name);
    };
}

从上面的示例中,我一直尝试使用特殊字符“*”创建通配符正则表达式搜索,但我无法循环遍历数组。

当前输出:如果输入是di,则显示所有相关匹配。

必需:我想要得到的是,如果输入是 di*/*(任何输入),它应该根据给定输入显示所有匹配项。

最佳答案

您的方法存在一些问题。首先,您在转义例程中对 * 进行转义,因此客户端无法使用它。

其次,您没有锚定您的线路,因此匹配可以发生在任何地方。

要修复此问题,请从转义函数中删除星号:

function escapeRegExp(string){
    return string.replace(/([.+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

然后在您的 watch 功能中将 * 替换为 .* 并添加行 anchor :

$scope.$watch('search', function (value) {
        var escaped = escapeRegExp(value);
        var formatted = escaped.replace('*', '.*')

        if(formatted.indexOf('*') === -1){
            formatted = '.*' + formatted + '.*'
        }

        regex = new RegExp('^' + formatted + '$', 'im');
    });

Here is a fiddle

关于javascript - Angular 中的正则表达式通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494410/

相关文章:

javascript - Chrome 跨站点资源 - 网站无法正常工作

javascript - $stateParams,如何将值从一种状态传递到另一种状态

javascript - 为什么我的 promise 在循环中存在计时问题,我该如何解决?

javascript - 滚动 "touchmove"时断断续续

c# - 为什么 javascript 有函数而 C# 有方法?

angularjs - 在AngularJS中使用 'ng-style'添加背景图片

javascript - 如何将自动完成值添加到列表中?

Java字符串用评估的键替换正则表达式模式

c++ - C++ Regex POSIX 字符类的问题

Java:匹配新行开头的重复字符并替换为相同数量的替代字符