2012-10-02 22 views
1

我正在實現類似於Facebook上看到的'typeahead'friends/followers功能。如何在javascript中使用'@'後面的兩個單詞字符串

當用戶在評論框中鍵入'@'鍵時,需要根據呈現自動完成列表的用戶名的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 
+0

你可以發佈一個示例輸入字符串和你想要的輸出嗎? – Nelson

+0

當然...我會編輯問題 – gordyr

回答

2

這樣好嗎?

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

Demo

+0

迄今爲止所有的好答案都謝謝。在決定我應該給誰答案之前,我只是做一些測試。 – gordyr

+0

感謝破壞,這裏有幾個正確的答案,但我已經授予你添加jsFiddle。非常感謝大家。 – gordyr

1

我不會用正則表達式,而是​​

從我的控制檯:

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" 
0

正則表達式將是/@(\w+ \w+)[^@]*$/(@符號,兩個單詞,接着非@字符,直到所述字符串的末尾)。我不確定這是否比子字符串/拆分方法更快。

var regex = /@(\w+ \w+)[^@]*$/, 
    myString = "@spork and @abe lincoln spam spam spam", 
    match = myString.match(regex)[1]; 
// match == "abe lincoln" 
+0

它可能足夠快並且可能比使用indexof更快:regexp在瀏覽器中進行了大量優化,特別是如果它們不是動態的。 –

+0

@nrabinowitz - 謝謝,這看起來不錯,但它返回null,如果我只輸入名字,例如只輸入'Joh'而不是'John Smith',我需要它返回一個匹配,即使只有部分第一個字是鍵入的。 – gordyr

+0

然後使用'/ @(\ w +(\ w +)?)[^ @] * $ /' – nrabinowitz

相關問題