返回包含regexp @ sign的单词

时间:2014-11-07 15:32:51

标签: javascript regex angularjs replace autocomplete

我有一个函数,当他们开始用@键入时自动填充用户名(类似于instagram) 当您键入@时,会出现一个用户列表,用户可以单击列表中的项目/用户“ex:@ User1”,脚本会在textarea“ex:@ User1”中使用用户名自动填充@。

第一次替换是“ex:@ User1”。但是当用户键入第二个@(而不是第一个字母)并且列表再次出现然后点击列表中的其他项目/用户时,所选项目/用户“ex:@ User2”将在第一个中添加@在第一个建议“ex:@ User2User1”前面。但另一方面,如果用户键入第二个@ WITH第一个字母,然后点击列表中的项目/用户,那么替换就可以了。

Link to codepen sample

这是我目前的职能:

var string = $scope.searchParam;
var pattern = /@\b.+?\b/g;
$scope.match = string.match(pattern)
if($scope.match){
    value = $scope.match.pop();
    console.log('match')

}else{
    console.log('was undefined');
    var pattern = /@/g;
    var found = string.match(pattern)
    console.log(found +' is value');
    if(found.length > 0){
        value = found.pop();
    }
}

string = string.replace(value, '@'+suggestion);

console.log('oke');
$scope.searchParam = string;
$scope.searchFilter = string;

我还试图检查它是否已经存在只是在@sign之后输入一个字符时触发:

if(watching && typeof $scope.searchParam !== 'undefined' && $scope.searchParam !== null) {
    var string = $scope.searchParam;
    var pattern = /@\b.+?\b/g;
    $scope.match = string.match(pattern)

    if($scope.match){

        console.log($scope.match.length + 'match aantal' + $scope.i + ' i aantal');
        $scope.matches.push($scope.match);
        console.log($scope.matches);
        var found = $filter('filter')($scope.matches,$scope.match,true)
        if (!found.length) {
            $scope.i++;
        }
    }

    $scope.completing = true;
    $scope.searchFilter = $scope.searchParam;
    $scope.selectedIndex = -1;
}

但匹配只有几个字母,所以这个数组被淹没了。这个问题可能有多个答案,我想知道在这种情况下你会采取什么措施。

1 个答案:

答案 0 :(得分:0)

问题出在这一行:

string = string.replace(value, '@'+suggestion);

如果您只输入@,则会替换第一个 @。为避免这种情况,您必须匹配最后一个:

string = string.replace(new RegExp(value+'$'), '@'+suggestion);

只有当它位于字符串的末尾时才会匹配该值,这正是您所需要的。

您可以查看on codepen