使用javascript自动从字符串生成标记

时间:2012-07-12 14:04:21

标签: javascript regex replace match

我需要 - 自动生成文本字符串的标签。在这种情况下,我将使用此字符串:

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停留”应该返回[“TheUKGuardián”,“伦敦“]
  3. 我显然在第二个要求中遇到了麻烦。有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

好的,这是一个想法。这可能不是最好的方法,但对你来说这可能是一个好的开始。

为了匹配Royal FamilyPrince Charles,或者甚至The United Kingdom之类的字符串,您可以编写一个正则表达式,查找以连续大写字母开头的连续字词。< / p>

这可能如下所示:(A-Z(a-z){5,}* )+

然后,您可以使用replace函数生成一个删除了匹配项的新字符串,然后使用原始正则表达式匹配最小长度的单个单词。

更新:在回复有关其他用户回答的评论时,我添加了{5,}修饰符以指示大写字母后跟五个或更多小写字母和一个空格,一次或多次。