Разделить строку по символу, который не находится между определенными символами - PullRequest
0 голосов
/ 17 января 2019

Я хочу разбить строку на «&» только в тех случаях, когда «&» не находится между символами «<%» и «%>». Между этими символами у меня есть специальные выражения, которые я хочу игнорировать во время разделения. Текст считается особенным, только если он находится между двумя ближайшими "<%" текстом "%>". Это работает так:

<%qwr<%qrw<%tret%>wet%>qwt => only this is scpecial <%tret%>
<%test142%>wqr%>%<%%>qwr%> => only this is <%test142%> and <%%> is special

Примеры:

1) my&string=21<%253&124%> <&> && => ['my', 'string=21<%253&124%> <', '> ', '', '']

2) new<%<&%235<%test&gg%>&test&f => ['new<%<', '%235<%test&gg%>', 'test', 'f']

3) a&<%&qwer&>ty%>&af => ['a', '<%&qwer&>ty%>', 'af']

Я пробовал '\&(?![^<%]*%>)' и (?<!(<%))\&(?!(%>)), но это работает неправильно.

1 Ответ

0 голосов
/ 17 января 2019

Я бы использовал обходной путь.

  1. соответствует всем <% & %> и замените его специальным символом (в моем случае _ подчеркивание), так что результат будет <% _ %>

  2. теперь разбить строку на & char

  3. окончательно замените специальный символ _ обратно на &

const mySplit = (mystr) => {
  const regex = /<%(?!%>).*%>/gm;
  const matches = mystr.match(regex);

  const tmpreplace = matches.map(e => e.replace(/&/g,'_'));
  matches.forEach(e => mystr = mystr.replace(e,tmpreplace));

  return mystr.split('&').map(e => e.replace(/_/g,'&'));
}

console.log(mySplit('my&string=21<%253&124%> <&> &&'));
console.log(mySplit('new<%<&%235<%test&gg%>&test&f'));
console.log(mySplit('a&<%&qwer&>ty%>&af'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...