[英]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.