2012-07-12 84 views
3

我需要爲文本字符串自動生成標籤。在這種情況下,我會用這個字符串:使用javascript自動從字符串生成標籤

var text = 'This text talks about loyalty in the Royal Family with Príncipe Charles'; 

我目前的執行情況,生成是6+個字符長的話標籤,並能正常工作。

words = (text).replace(/[^a-zA-Z\s]/g,function(str){return '';}); 
words = words.match(/\w{6,}/g); 
console.log(words); 

這將返回:

["loyalty","Family","Prince","Charles"] 

的問題是,有時,標籤應該是一組特定的單詞。我需要的結果是:

["loyalty","Royal Family","Príncipe Charles"] 

這意味着,替換/匹配代碼應該測試:

  1. 詞語是6個字符長(或更多);和/或
  2. 如果一組單詞以大寫字母開頭,那麼這些單詞應該在同一個數組元素中連接在一起。不要緊,如果一些單詞少於6個字符長 - 但至少其中一個必須是6+,例如:「停在英國倫敦的Guardián」應該返回[「The UKGuardián」,「倫敦「]

我明顯在第二個要求中遇到了麻煩。有任何想法嗎?謝謝!

回答

5
var text = 'This text talks about loyalty in the Royal Family with Prince Charles. Stop at The UK Guardian in London'; 

text.match(/(([A-Z]\w*\s*){2,})|(\w{6,})/g) 

將返回

["loyalty", "Royal Family ", "Prince Charles", "The UK Guardian ", "London"] 

爲了滿足第二個要求,這是更好地跑過來找到了比賽的另一個正則表達式:

var text = 'This is a Short Set Of Words about the Royal Family' 

matches = text.match(/(([A-Z]\w*\s*){2,})|(\w{6,})/g) 
matches.filter(function(m) { 
    return m.match(/\w{6,}/) 
}); 
+1

這似乎工作,但它也會匹配「我很酷」,這不匹配,因爲沒有任何字符> = 6個字符。 – 2012-07-12 14:15:52

+1

+1,這個更新很好。這似乎工作正如OP要:-) – 2012-07-12 14:19:09

+0

偉大的解決方案!只是一件重要的事情,解決方案應該考慮特殊字符。例如,「PrincéHermione」正在返回[「Hermione」];和「superhábilmente」正在返回[「superh」,「bilmente」] – andufo 2012-07-12 14:29:09

0

好,這是一個想法。這可能不是實現這一目標的最佳方式,但它對您而言可能是一個好的開始。

爲了匹配字符串像Royal FamilyPrince Charles,或者甚至The United Kingdom,你可以寫一個正則表達式,以查找開始連續大寫字母詞的繼承。

這可能是這樣的:(A-Z(a-z){5,}*)+

然後,您可以使用替換功能來生成除去了相匹配的新的字符串,然後使用原來的正則表達式匹配的最小長度的單詞。

更新:在迴應評論對其他用戶的回答,我已經添加了{5,}修飾符來指示大寫字母后面五個或更多小寫字母和空格,一次或多次。