如果我有这样的字符串
var comment = "Mmmm #yummy #donut at #CZ"
如何获取字符串变量中存在的哈希标记列表?
我尝试使用JavaScript split()方法,但我必须继续拆分从初始拆分字符串创建的所有字符串。 有没有更简单的方法呢?
答案 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?