如何在JavaScript中为特殊条件设置正则表达式



我需要帮助为以下条件编写正则表达式模式:

哈希标记字符的限制

长度

  • 您只需要在单词前添加一个#即可使其成为标签。然而,由于一条推文只能包含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;
}

相关内容

  • 没有找到相关文章