我有以下字符串和正则表达式
const message = "asdasd :+1::skin-tone-4:"
const emojiRegex = /(:[a-zA-Z0-9-_+]+:(:skin-tone-[1-6]:)?)/g
当我在.match(emojiRegex)
上使用message
时,会得到以下正确的结果:
[":+1::skin-tone-4:"]
但是当我尝试将.split(emojiRegex)
与相同的正则表达式一起使用时,会得到以下结果:
["asdasd ", ":+1::skin-tone-4:", ":skin-tone-4:", ""]
我希望这是结果:
["asdasd ", ":+1::skin-tone-4:", ""]
这是怎么了?我应该如何更改我的正则表达式以达到预期效果?
const message = "asdasd :+1::skin-tone-4:"
const emojiRegex = /(:[a-zA-Z0-9-_+]+:(:skin-tone-[1-6]:)?)/g
console.log(message.match(emojiRegex));
console.log(message.split(emojiRegex));
答案 0 :(得分:2)
您必须删除:skin-tone-[1-6]:
周围的捕获组,如MDN says:
如果
separator
是包含捕获括号()
的正则表达式,则匹配的结果将包含在数组中。
const message = "asdasd :+1::skin-tone-4:"
const emojiRegex = /(:[a-zA-Z0-9-_+]+::skin-tone-[1-6]:?)/g
console.log(message.split(emojiRegex));
您还可以使用非捕获组(?)?
并从结果中删除所有为空字符串的元素:
const message = "asdasd :+1::skin-tone-4:"
const message2 = "asdasd :+1:"
const emojiRegex = /(:[a-zA-Z0-9-_+]+:(?:skin-tone-[1-6]:)?)/g
console.log(message.split(emojiRegex).filter(Boolean));
console.log(message2.split(emojiRegex).filter(Boolean));
答案 1 :(得分:1)
您不应在拆分正则表达式中使用捕获部分。来自mdn文档,
如果分隔符是包含捕获的正则表达式 括号,然后每次匹配分隔符,结果 (包括任何未定义的结果)的捕获括号是 拼接到输出数组中。
const message = "asdasd :+1::skin-tone-4:"
const emojiRegex = /(:[a-zA-Z0-9-_+]+::skin-tone-[1-6]:)/g
console.log(message.split(emojiRegex));