3

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

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+,例如:“Stop at The UK Guardián in London”应该返回 ["The UK Guardián", "伦敦”]

我显然在第二个要求中遇到了麻烦。有任何想法吗?谢谢!

4

2 回答 2

7
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,}/)
});
于 2012-07-12T14:14:18.737 回答
0

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

为了匹配像Royal FamilyandPrince Charles或什至这样的字符串The United Kingdom,您可以编写一个正则表达式来查找以连续大写字母开头的连续单词。

这可能看起来像这样:(A-Z(a-z){5,}* )+

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

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

于 2012-07-12T14:16:17.397 回答