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

时间:2019-02-12 04:37:09

标签: javascript regex unicode

在以下情况下,我需要帮助编写正则表达式模式:

对标签字符的限制

长度

  • 您只需要在单词前添加#即可使其成为主题标签。但是,由于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库。

谢谢

2 个答案:

答案 0 :(得分:1)

假设主题标签中不允许的字符是!$%^&*+.(您提到的字符)和,(根据您的示例),则可以使用以下正则表达式模式:

/#[^\s!$%^&*+.,#]+/gm

Here's a demo

注意:要排除更多字符,您可以像上面一样在字符类中添加它们。显然,您不能仅依靠字母数字字符,因为您要支持其他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;
}