使用Regex分割字符串会产生意外的结果

时间:2018-08-21 14:43:17

标签: javascript regex string split

我有以下字符串和正则表达式

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));

2 个答案:

答案 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));