在以下情况下,我需要帮助编写正则表达式模式:
长度
您只需要在单词前添加#即可使其成为主题标签。但是,由于Tweet仅限于140个字符以下,因此最好的主题标签是由单个单词或几个字母组成的主题标签。 Twitter专家建议将关键字保持在6个字符以内。
在关键字中仅使用数字和字母。您可以使用下划线,但出于美学原因,请谨慎使用。连字符和破折号不起作用。
没有空格
标签不支持空格。因此,如果您使用两个词,请跳过空格。例如,在美国大选之后的主题标签被标记为#USelection,而不是$ US选举。
没有特殊字符
#标签只能与#符号一起使用。特殊字符,例如“!,$,%,^,&,*,+ 、.”不管用。 Twitter识别出井号,然后将主题标签转换为可点击的链接。
HashTag可以以数字开头
标签可以使用任何语言
标签可以是表情符号或符号
我想到了这样的想法,但其中不包括最后两个条件:
const subStr = postText.split(/(?=[\s:#,+/][a-zA-Z\d]+)(#+\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库。
谢谢
答案 0 :(得分:1)
假设主题标签中不允许的字符是!$%^&*+.
(您提到的字符)和,
(根据您的示例),则可以使用以下正则表达式模式:
/#[^\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);
});
}
答案 1 :(得分:0)
这是一种可能的解决方案,没有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;
}