我需要帮助为以下条件编写正则表达式模式:
哈希标记字符的限制
长度
-
您只需要在单词前添加一个#即可使其成为标签。然而,由于一条推文只能包含140个字符,最好的标签是由一个单词或几个字母组成的标签。Twitter专家建议将关键词控制在6个字符以内。
-
在关键字中只使用数字和字母。您可以使用下划线,但出于美观的原因,请谨慎使用。连字符和破折号不起作用。
-
无空格
哈希标记不支持空格。因此,如果你使用两个单词,跳过空格。例如,关注美国大选的标签被标记为#USelection,而不是$US election。
-
无特殊字符
哈希标记只能使用#符号。像"!,$,%,^,&,*,+,."这样的特殊字符将不起作用。推特识别英镑符号,然后将标签转换为可点击的链接。
-
哈希标签可以从数字开始
-
哈希标签可以是任何语言的
-
哈希标签可以是表情符号或符号
我有这样的想法,但不包括最后两个条件:
const subStr = postText.split(/(?=[s:#,+/][a-zA-Zd]+)(#+w{2,})/gm);
const result = _.filter(subStr, word => word.startsWith('#')).map(hashTag => hashTag.substr(1)) || [];
编辑:
示例:如果我有:
const postText = "#hello12#123 #hi #£hihi #This is #👩 #Hyvääpäivää #Dzieńdobry #जलवायुपरिवर्तन an #example of some text with #hash-tags - http://www.example.com/#anchor but dont want the link,#hashtag1,hi #123 hfg skjdf kjsdhf jsdhf kjhsdf kjhsdf khdsf kjhsdf kjhdsf hjjhjhf kjhsdjhd kjhsdfkjhsd #lasthashtag";
结果应该是:
["hello12", "123", "hi", "This", "👩", "Hyvääpäivää", "Dzieńdobry", "जलवायुपरिवर्तन", "example", "hash", "anchor", "hashtag1", "123", "lasthashtag"]
我现在拥有的:
["hello12", "123", "hi", "This", "Hyv", "Dzie", "example", "hash", "anchor", "hashtag1", "123", "lasthashtag"]
注意:我不想使用JavaScript库。
感谢
假设标签中不允许使用的字符是!$%^&*+.
(您提到的字符)和,
(基于您的示例),则可以使用以下regex模式:
/#[^s!$%^&*+.,#]+/gm
这是一个演示
注意:要排除更多的字符,可以像我上面所做的那样将它们添加到字符类中。显然,您不能仅仅因为希望支持其他Unicode符号和表情符号而依赖字母数字字符。
JavaScript代码示例:
const regex = /#[^s!$%^&*+.,#]+/gm;
const str = "#hello12#123 #hi #£hihi #This is #👩 #Hyvääpäivää #Dzieńdobry #जलवायुपरिवर्तन an #example of some text with #hash-tags - http://www.example.com/#anchor but dont want the link,#hashtag1,hi #123 hfg skjdf kjsdhf jsdhf kjhsdf kjhsdf khdsf kjhsdf kjhdsf hjjhjhf kjhsdjhd kjhsdfkjhsd #lasthashtag";
let m;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
m.forEach((match) => {
console.log("Found match: " + match);
});
}
这是一个没有while
的可能解决方案,对我有效,感谢@Ahmed Abdelhameed提供的模式:
function getHashTags(postText) {
const regex = /#[^s!$%^&*+.,£#]+/gm;
const selectedHashTag = [];
const subStr = postText.split(' ');
const checkHashTag = _.filter(subStr, word => word.startsWith('#') || word.includes('#'));
checkHashTag.map((hashTags) => {
if (hashTags.match(regex)) {
hashTags.match(regex).map(hashTag => selectedHashTag.push(hashTag.substr(1)));
}
return true;
});
return selectedHashTag;
}