从字符串中提取主题标签。

时间:2014-08-28 00:12:23

标签: javascript hashtag

如果我有这样的字符串

var comment =  "Mmmm #yummy #donut at #CZ"

如何获取字符串变量中存在的哈希标记列表?

我尝试使用JavaScript split()方法,但我必须继续拆分从初始拆分字符串创建的所有字符串。 有没有更简单的方法呢?

6 个答案:

答案 0 :(得分:10)

这可以用于任何带字母字符的内容,如果需要,可以扩展其他字符的正则表达式:

myString.match(/#[a-z]+/gi);

答案 1 :(得分:10)

只需使用正则表达式查找哈希后跟非空格字符的出现。

"Mmmm #yummy #donut at #CZ".match(/#\w+/g)
// evaluates to ["#yummy", "#donut", "#CZ"]

答案 2 :(得分:2)

您是否关心Unicode或非英语主题标签?

"Mmmm #yummy #donut at #CZ #中文 #.dou #。#?#♥️ #にほ".match(/#[\p{L}]+/ugi)
=> (5) ["#yummy", "#donut", "#CZ", "#中文", "#にほ"]

如此答案所解释:https://stackoverflow.com/a/35112226/515585

  

\p{L}匹配Unicode字符

     

u PCRE_UTF8修饰符,此修饰符会额外打开   与Perl不兼容的PCRE功能。

答案 3 :(得分:0)

如果您关心可读性:

yourText.split(' ').filter(v=> v.startsWith('#'))

将返回["#yummy", "#donut", "#CZ"]

答案 4 :(得分:0)

这是另一个非常简单的正则表达式,它将允许在主题标签中使用表情符号和数字,以及不使用任何空格将其拆分。在大多数情况下,这应该足够了:

"Mmmm #yummy #donut at #CZ#efrefg #:) #cool?#r234#FEGERGR#fegergr".match(/#[^\s#]*/gmi);
// => ["#yummy", "#donut", "#CZ", "#efrefg", "#:)", "#cool?", "#r234", "#FEGERGR", "#fegergr"]

尽管有一点缺点:此正则表达式会将标点符号添加到主题标签的末尾,例如:

"Mmmm #yummy.#donut#cool?#r234#FEGERGR;#fegergr".match(/#[^\s#]*/gmi);
// => ["#yummy.", "#donut", "#cool?", "#r234", "#FEGERGR;", "#fegergr"]

但是您可以自己将正则表达式扩展到您想要省略的字符(标点),如下所示:

"Mmmm #yummy.#donut#cool?#r234#FEGERGR;#fegergr".match(/#[^\s#\.\;]*/gmi);
// => ["#yummy", "#donut", "#cool?", "#r234", "#FEGERGR", "#fegergr"]

答案 5 :(得分:0)

如果您需要标签中的任何字母字符,我会选择这样的:

let text = "улетные #выходные // #holiday in the countryside";
const hashtags = []
if (text.length) {
    let preHashtags = text.split('#')
    let i = 0;
    if (text[0] !== '#') i++ 

    for (null; i < preHashtags.length; i++) {
        let item = preHashtags[i]
        hashtags.push(item.split(' ')[0]) 
        // String.prototype.split() is needed to sort out non-hashtag related string data
    }
}


console.log(hashtags) // outputs [ 'выходные', 'holiday' ]

我们使用 if (text[0] !== '#') i++ 来检查“text”字符串中的第一个字母是否不是“#”。在这种情况下,我们不需要遍历 preHashtags 数组中的第一个元素。否则,我们的文本字符串以主题标签开头,我们需要处理它。

请注意,您可能需要对结果 hashtags 数组进行输入验证。另请注意,for 循环中的 null 仅用于可读性目的,您也可以使用 for (;i < preHashtags.length; i++)

这种方法的好处是它肯定包含任何可能的符号(因此需要进行完整性检查),包括所有非拉丁字母,并且更易于理解,尤其是对于初学者而言。另一方面,在 Chrome(因此可能是其他 Chromium 衍生浏览器以及 node.js)中检查时,性能更优,而在 Firefox 中差 6-7%,在 Safari 中差 13%,由以下判断此测试:https://jsben.ch/VuhEi

因此,选择取决于您是要在 node.js 还是浏览器中运行代码,如果是后者,您是否有很多移动客户端使用 MobileSafari?