Регулярное выражение для разделения с несколькими разделителями из одного или нескольких символов - PullRequest
3 голосов
/ 14 апреля 2020

Я хочу разбить строку с разделителями или .. Пока они их хранят:

"'TEST' .. 'TEST2' ".split(/([' ] ..)/g);

, чтобы получить:

["'", "TEST", "'", "..", "'", "TEST2", "'" ]

, но это не работает: знаете ли вы как это исправить?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Шаблон [' ] .. соответствует ' или пробелу с пробелом и любыми двумя символами, кроме символов разрыва строки.

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

console.log("'TEST' .. 'TEST2' ".trim().split(/\s*('|\.{2})\s*/).filter(Boolean))

Здесь

  • .trim() - удалить начальный / конечный пробел
  • .split(/\s*('|\.{2})\s*/) - разбить строку на ' или двойная точка (которые захватываются в группе захвата и, следовательно, хранятся в полученном массиве), заключенные в 0+ пробелов
  • .filter(Boolean) - удаляет пустые элементы.
1 голос
/ 14 апреля 2020

Разделение при сохранении разделителей часто можно уменьшить до matchAll. В этом случае /(?:'|\.\.|\S[^']+)/g, кажется, делает работу на примере. Идея состоит в чередовании буквальных одинарных кавычек, двух буквенных периодов или любой последовательности вплоть до одной кавычки, которая начинается с не пробела.

const result = [..."'TEST' .. 'TEST2' ".matchAll(/(?:'|\.\.|\S[^']+)/g)].flat();
console.log(result);

Еще одна идея, которая может быть более надежной, даже если это не одноразовое регулярное выражение, заключается в использовании традиционного неумного паттерна "вещи между разделителями", такого как /'([^']+)'/g, затем flatMap, чтобы очистить массив результатов в соответствии с вашим форматом.

const s = "'TEST' .. 'TEST2' ";
const result = [...s.matchAll(/'([^']+)'/g)].flatMap(e =>
  ["'", e[1], "'", ".."]
).slice(0, -1);
console.log(result);
1 голос
/ 14 апреля 2020

Я не уверен, что это будет работать для всех ситуаций, но вы можете попробовать это:

"'TEST' .. 'TEST2' ".replace(/(\'|\.\.)/g, ' $1 ').trim().split(/\s+/)

return:

["'", "TEST", "'", "..", "'", "TEST2", "'"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...