JS split () регулярное выражение с тремя соответствиями в один массив результатов - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь разбить строку типа ниже в JS с split ().

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" и т. Д.?

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Вы можете переключаться между тире (в окружении пробелов) и двоеточием, за которым следует пробел:

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+): /)
);
0 голосов
/ 21 октября 2018

Если вам нужно только решение, использующее 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' ]
0 голосов
/ 21 октября 2018

Создайте класс символов с символами , :, -, а затем разбейте на 2 или 3 из этих символов в строке:

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