Начиная с такого текста;

var txt = "hello [a14] world, and [b74] some more [h85], ..."

Ожидаю как результат

var arr = 
  [ "hello "
  , "[a14]"
  , " world, and "
  , "[b74]"
  , " some more "
  , "[h85]"
  , ", ..."
  ] 

То, что я пробовал до сих пор, но освоить регулярные выражения для меня все еще сложно ...

let txt = "hello [a14] world, and [b74] some more [h85], ..."

let arr = txt.match(/(\[(.*?)\])|(.*?)/g)

console.log( arr )
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
Mister Jojo 11 Фев 2021 в 07:33

3 ответа

Лучший ответ

Вы можете попробовать /(\[[^\]\[]*\]|[^\]\[]+)/g. Отличия заключаются в следующем:

  • использовал + вместо *, чтобы захватить хотя бы один символ и избежать сопоставления пустых строк
  • [^\]\[] дает вам "любой символ без скобок", чтобы вы могли избежать ненадежного сопоставления с ?
  • перемещены группы захвата, чтобы быть более интуитивно понятными
const txt = "hello [a14] world, and [b74] some more [h85], ...";
console.log(txt.match(/(\[[^\]\[]*\]|[^\]\[]+)/g));
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
ggorlen 11 Фев 2021 в 04:42

Вы также можете попробовать разделение на поисковые запросы:

var text = "hello [a14] world, and [b74] some more [h85], ...";
var arr = text.split(/(?=\[)|(?<=\])/);
console.log(arr);

Логика здесь состоит в том, чтобы разбивать строку всякий раз, когда следует [ или то, что предшествует ]. Обратите внимание, что поисковые пути имеют нулевую ширину, и поэтому шаблон (?=\[)|(?<=\]) совпадает, но фактически не использует текст во входных данных при разделении.

2
Tim Biegeleisen 11 Фев 2021 в 04:52

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

let txt = "hello [a14] world, and [b74] some more [h85], ..."
let regex = /(\[[^\]]*\])/;
let result = txt.split(regex);
console.log(result);

Выход:

[
  "hello ",
  "[a14]",
  " world, and ",
  "[b74]",
  " some more ",
  "[h85]",
  ", ..."
]

Пояснение:

  • ( - начало группы захвата
  • \[ - сканировать [
  • [^\]]* - сканировать все, кроме ]
  • \] - сканировать ]
  • ) - конец группы захвата
1
Peter Thoeny 11 Фев 2021 в 04:54
66148804