2012-07-12 52 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,}修饰符来指示大写字母后面五个或更多小写字母和空格,一次或多次。