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

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Используя .split() с регулярным выражением, как правильно выполнить разделение с использованием пробелов с несколькими символами?

Например, со строкой типа:

const str = 'Supreme > 22 < 27 < 34> 185';

ожидаемый результат будет:

const output = ['Supreme', '> 22', '< 27', '< 34', '> 185'];

Я попытался использовать .split() с шаблоном /. ?(?=>|<)/ , но он возвращает обратное, например:

const opposite = [ '', '', '', '', '> 185' ]

Комментарии:

1. Используйте str.split(/s*(?=[><])/).filter(Boolean)

Ответ №1:

Вы можете использовать

 /s*(?=[><])/
  

Смотрите Демонстрацию регулярных выражений. Он соответствует:

  • s* — ноль или более символов пробела
  • (?=[><]) — сразу же следует < или > .

Поскольку шаблон может соответствовать пустым строкам, в результирующем массиве будут пустые элементы, которые потребуется удалить, например, с .filter(Boolean) помощью .

Смотрите демонстрацию JavaScript:

 const str = 'Supreme > 22 < 27 < 34> 185';
console.log(str.split(/s*(?=[><])/).filter(Boolean));  

Подход сопоставления может быть реализован с помощью

 console.log('Supreme > 22 < 27 < 34> 185'
   .match(/(?:^|[<>])[sS]*?[^s<>](?=s*[<>]|$)/g))  

Смотрите Демонстрацию регулярных выражений. Подробные сведения:

  • (?:^|[<>]) — начало строки или < или >
  • [sS]*? — любые нулевые или более символов, как можно меньше
  • [^s<>] — любой символ, кроме пробела, > и <
  • (?=s*[<>]|$) — сразу же следуют любые символы 0 пробелов, а затем < или > или конец строки.

Ответ №2:

Вы можете использовать метод сопоставления. Он вернет ваш ожидаемый результат.

 const str = 'Supreme > 22 < 27 < 34> 185';
const ret = str.match(/(w )|(<s*d )|(>s*d )/g);
console.log(ret);  

Комментарии:

1. Вы можете опустить группы захвата и опустить 1 из альтернатив, используя класс символов <> . Шаблон может быть сокращен до w |[<>]s*d