只获得最后一场比赛? .match(字)

时间:2016-03-03 12:56:39

标签: javascript jquery

我有一个正则表达式从textarea获取@user。当用户用@键入内容时,我会得到它。

我的问题是,我想得到最后一场比赛,而不是所有比赛。

例如:

用户类型:

@josh and @marie = want to show @marie
@josh loves @marie and @anne = show @anne

我的代码显示如下:

@josh,@marie,@anne

我可以获得最后一个@something条目吗? (当用户输入时)

var word=/@(\w+)/ig;

$("#comment").on("keyup",function() {

    var content = $(this).val();
    var name = content.match(word);
    var dataString = name;

    if(name.length > 0) {
        $("#result").text(name);
    }
    return false();
});

HTML

<textarea id=comment>@josh and @marie</textarea>
<div id=result></div>

https://jsfiddle.net/dcs5pat8/(按文字区域)

6 个答案:

答案 0 :(得分:4)

我的建议是,您只显示结果的最后一个条目。

您可以通过更改行来执行此操作: var name = content.match(word);

var names = content.match(word).split(',');
var name = names[names.length - 1];

更详细地说,它的作用是从正则表达式中获取所有结果,而不是将其转换为数组,分割每个单词。然后它将数组的最后一项归因于name变量。

希望这有用。

答案 1 :(得分:4)

除了获得所有匹配并获得最后一个匹配之外,您还可以使用捕获组来获取最后一个匹配项:

var word=/.*(@\w+)/i;
var name = content.match(word)[1];  

或者使用exec,整体看起来像:

var word=/.*(@\w+)/i;

$("#comment").on("input",function() { //changed keyup to input

var content=$(this).val();
var match = word.exec(content); 

if(match){
 $("#result").text(match[1]);
}

});

Fiddle

PS,如果你的目标是更通用的方法,你需要在获取所有单词和单个单词之间切换,我建议保持全局匹配,并在Jonas的回答中得到最后一个。

答案 2 :(得分:2)

您可以简单地选择或弹出.match()

返回的匹配数组中的最后一个匹配项
var word=/@(\w+)/ig;

$("#comment").on("keyup",function() {

    var content=$(this).val();
    var matches = content.match(word);
    var lastmatch = matches.pop();

    //IF YOU NEED TO KEEP INTACT THE VAR MATCHES
    //var lastmatch = matches[matches.length - 1];


    if(name.length>0){
        $("#result").text(lastmatch);
    }
    return false();
});

JSFiddle

答案 3 :(得分:1)

使用这个正则表达式&#39; / @(\ w +)$ / ig&#39; insted&#39; / @(\ w +)/ ig& #39;

然后你的代码会像魅力一样运行。 ;)

var word=/@(\w+)$/ig;

$("#comment").on("keyup",function() {

var content=$(this).val();
var name = content.match(word);
var dataString = name;

if(name.length>0){
 $("#result").text(name);
}
return false();
});

看到它听到https://jsfiddle.net/dcs5pat8/1/

答案 4 :(得分:1)

我喜欢这个答案,你把所有的@名字,@ name1,@ name2列在你的列表中,然后拆掉最后一个,但这里只是一步

//split on @something
//the penultimate item is our target
//if there is < 2 items there weren't any @somethings so return ''
user = (split = "testing @charlie testing".split(/(@[^ ]*)/)).length > 1 ? split.splice(-2,1)[0] : '';

https://jsfiddle.net/ek19h0fb/1/

答案 5 :(得分:0)

只有一行可以做

var name = content.match(word).reverse()[0];