Расщепленная строка со специфическим образованием Angular 6, Typescript - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь использовать регулярные выражения с javascript, у меня есть следующий список:

word1 @ ['id1', 'name1'] @ @ ['id2', 'name2'] @@ ['id3', 'name3'] @ word2 @ ['id4', 'name4'] @ word3 @ ['id5', 'name5'] @

Я хочу обнаружить, что все: @ ['.....'] @ и разделить их следующим образом:

word1
@['id1', 'name1']@
@['id2', 'name2']@
@['id3', 'name3']@
word2
@['id4', 'name4']@
word3
@['id5', 'name5']@

Поэтому я могу прочитать идентификатор и имя позже, чтобы создать ссылку:

<a href="url/[id]">[name]</a>

Я пробовал это регулярное выражение:

[@\['](.)*['\]@]

Но это всего лишь отметка всего от первого @ ['до конца в имени 5.

Простой код:

const reg = /[@\['](.)*['\]@]]/;
const arr = content.split(reg);

Если кто-нибудь знает, как его разбить, я был бы признателен за решение этой проблемы.Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы можете разбить строку, используя

s.split(/\s*(@\[.*?]@)\s*/).filter(Boolean)

См. Демонстрационную версию JS:

var s = "word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@";
console.log(s.split(/\s*(@\[.*?]@)\s*/).filter(Boolean));

Шаблон соответствует 0+ пробелов, затем захватывает @[, любые 0+ символов, кроме символов перевода строки, как можно меньше, вплоть до первого ]@, а затем совпадения без захвата 0+ пробелов.Захваченные подстроки попадают в результирующий массив, а .filter(Boolean) удаляет пустые элементы.

0 голосов
/ 30 ноября 2018

Вместо split рассмотрим .match, что может упростить логику: либо сопоставить символы слова, либо сопоставить @[, за которыми следуют любые символы, за которыми следует ]@:

\w+|@\[.*?\]@

const input = `word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@`;
console.log(input.match(/\w+|@\[.*?\]@/g));
  

Если внутренняя часть [] может содержать ]@ s, которые вы не хотите сопоставлять, например @['id1', ']@', 'name1']@, тогда вам понадобится немногобольше логики - внутри [] s повторяются группы из ' или " строк с разделителями:

\w+|@\[(?:(?:'[^']+'|"[^"]+")(?:, *|(?=\])))*\]@

https://regex101.com/r/rDW2iD/1

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