Javascript 如何用多个分隔符拆分字符串并将它们包含在结果中

Javascript how to split string by multiple delimiters and include them in the result

我正在尝试用多个定界符分隔字符串并将它们包含在结果中。将所有连续的非空白字符视为单个单词。示例:"I'm working on a new super-project wow. Yay!" 变为“!Yay .wow project-super new a on working I'm” 到目前为止我的代码:

function test(string){
    console.log(string.split(/([.'\!'+a-zA-Z]+)/g ).reverse().join(' ') );
}

var string ="I'm working on a new super-project wow. Yay!"
test(string)

到目前为止的输出是: 耶!哇。项目 - 超级新的工作我是

我仍然得到错误的结果。任何帮助,将不胜感激。

我建议先用标点符号交换单词(使用 .replace(/(^|\s)(\w+)([^\w\s]+)(?!\S)/g,"")),然后匹配所有非白色 space 块并加入 space:

function test(string){
    console.log(string.replace(/(^|\s)(\w+)([^\w\s]+)(?!\S)/g,"").match(/\S+/g).reverse().join(' ') );
}
//"!Yay .wow project-super new a on working I'm"
var string ="I'm working on a new super-project wow. Yay!"
test(string)

单词标点交换正则表达式详细信息:

  • (^|\s) - 第 1 组:字符串开头或白色space
  • (\w+) - 第 2 组:一个或多个单词字符
  • ([^\w\s]+) - 第 3 组:除 word 和 whitespace chars
  • 以外的任何 1+ 个词
  • (?!\S) - 在当前位置的右边不允许非白色space 字符。这些子模式与 (^|\s) 一起形成 whitespace 字边界 .

规则不是很清楚,可能会有更多情况要包括,但如果没有,拆分 [!?.\s-]+(或任何分隔符)将是一个解决方案。您不需要侵入 .replace().match() 方法:

var str = "I'm working on a new super-project wow. Yay!";
console.log(str.split(/([!?.\s-])/g).reverse().join(''));