JS split() 正则表达式与单个结果数组的三个匹配

JS split() Regex with Three Matches to a single Results Array

我正在尝试使用 split() 在 JS 中拆分以下类型的字符串。

let shape = "Cube - Level 2: three-dimensional";

我想要的最终状态是这样的:

0: "Cube"
1: "Level 2"
2: "three-dimensional"

我可以单独捕获 \s-\sLevel 模式之前的单词,并具有正面前瞻性:

(.+)(?=\s-\sLevel\s)

和带有简单捕获组的 Level\s[0-9] 模式:

(Level\s[0-9])

以及Level:\s之后的任意字符:

(?<=[0-9]:\s).*

但我正在尝试弄清楚如何使用 JS split() 捕获所有三个。有没有办法捕获它们 split[0] = "Cube"split[1] = "Level 2" 等?

用字符 </code>、<code>:- 创建一个字符 class,然后拆分行中的 2 个或 3 个字符:

let shape = "Cube - Level 2: three-dimensional";
console.log(shape.split(/[ \-:]{2,3}/));

您可以在破折号(由 spaces 包围)和冒号后跟 space:

之间交替

let shape = "Cube - Level 2: three-dimensional";
console.log(
  shape.split(/ - |: /)
);

如果您总是想将字符串拆分为这三个组,那么您可以 捕获 捕获组中的 Level 部分:

let shape = "Cube - Level 2: three-dimensional";
console.log(
  shape.split(/ - (Level \d+): /)
);

如果您只想要一个使用 String.split() 的解决方案,那么我的回答是错误的,但是如果您正在寻找有关如何匹配字符串的问题的一般答案,那么我建议:

/^(.*?) - (Level (?:.*?)): (.*)$/.exec(str).slice(1)

因此,例如:

let str = "Tetra - hedron - whatever - you - like - Level 867-5309: three-dimensional"

console.log(/^(.*?) - (Level (?:.*?)): (.*)$/.exec(str).slice(1))

[ 'Tetra - hedron - whatever - you - like',
  'Level 867-5309',
  'three-dimensional' ]