繁体   English   中英

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

[英]Extracting hashtags out of a string.

如果我有这样的字符串

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

如何获取字符串变量中存在的 hash 标签的列表?

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

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

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

只需使用正则表达式来查找出现的散列后跟非空白字符。

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

您是否关心 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 的附加功能。

如果您关心可读性:

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

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

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

"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"]

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

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 的移动客户端?

content.split(/[\s\n\r]/gim).filter(tag => tag.startsWith('#'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM