1

我正在实现类似于在 Facebook 上看到的“提前输入”朋友/关注者功能。

当用户在评论框中键入“@”键时,需要根据 json 用户名数组检查下两个单词,从而呈现自动完成列表。

当用户按下'@'时,我已经有一个当前触发的事件,然后将全文字符串发送到一个单独的函数中,我打算在其中执行匹配。我现在只需要解析此文本并检索“@”后面的文本。

因此,实际的问题是如何检索字符串中直接跟在“@”之后的文本。

必须从字符串中最后一次出现的“@”中提取匹配项。(以允许在用户键入的同一字符串中进行多个自动完成。)

希望对正则表达式/JS字符串操作有更好理解的人可以提供帮助。

提前致谢。

编辑:

只是添加一些示例:

@John Smith says hello

应该返回:

John smith says hello    OR  simply 'John Smith' - Either is okay for this purpose

但是这个字符串:

I was talking to @John Smith and he told me all about @Sarah Smith

应该只返回:

 Sarah Smith
4

3 回答 3

2

那样可以么 ?

txt.substring(txt.lastIndexOf('@')+1).split(' ').slice(0, 2).join(' ')

演示

于 2012-10-02T17:02:23.213 回答
1

我不会使用正则表达式,而是使用lastIndexOf

从我的控制台:

var a = "@tony @stark"
> undefined
var b = a.lastIndexOf('@')
> undefined
a.substr(b, a.length)
> "@stark"

或者,如果您愿意

a.substr(b+1, a.length)
> "stark"

*更新

function getRest(a) {
  var b = a.lastIndexOf('@'); 
  return a.substr(b+1, a.length);
}
getRest('@John Smith says hello')
> "John Smith says hello"
getRest('I was talking to @John Smith and he told me all about @Sarah Smith')
> "Sarah Smith"
于 2012-10-02T17:02:20.540 回答
0

正则表达式将是/@(\w+ \w+)[^@]*$/(@ 符号,两个单词,后跟非 @ 字符,直到字符串末尾)。我不确定这是否比 substring/split 方法更快。

var regex = /@(\w+ \w+)[^@]*$/,
    myString = "@spork and @abe lincoln spam spam spam",
    match = myString.match(regex)[1];
// match == "abe lincoln"
于 2012-10-02T17:02:54.560 回答