#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