Токенизация строки с Javascript, включая не совпадающие блоки - PullRequest
0 голосов
/ 27 января 2019

У меня есть эта строка:

Test block {{section1|val}}
test block
{| class="class1"
some test
|}

Я хотел бы получить следующие элементы:

  • Test block
  • {{section1|val}}
  • test block
  • {| class="class1"\nsome test\n|}

Я могу получить блоки с { / } со следующим регулярным выражением:

const regex = /(\{(.|[\r\n])*?)\}/g;
const matches = content.match(regex);

Но как я могу получить одновременно другие текстовые блоки.

Спасибо за вашу помощь!Thierry

Ответы [ 3 ]

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

Надеюсь, это поможет

[^{]+ - Соответствие обычному тексту до {.

{[^}]+}}? - Соответствие текста между {}.

let str = `Test block {{section1|val}}
test block
{| class="class1"
some test
|} foo bar`

let temp = str.match(/[^{]+|{[^}]+}}?/g)

let op = temp.map(e=> e.trim().replace(/^\n|\n$/g,''))

console.log(op)
0 голосов
/ 27 января 2019

Это простое регулярное выражение из двух переменных должно выполнять вашу работу.

\w+(?:\s+\w+)*|\{+[\w\W]*?\}+

Здесь регулярное выражение \w+(?:\s+\w+)* соответствует строкам обычного текста abc или abc xyx, а регулярное выражение \{+[\w\W]*?\}+ соответствует тексту типа {{abc}} или {xyz}

Демо

var s = `Test block {{section1|val}}
test block
{| class="class1"
some test
|}`;

var arr = s.match(/\w+(?:\s+\w+)|\{+[\w\W]*?\}+/g);
console.log(arr);
0 голосов
/ 27 января 2019

Поочередно между {{ }} разделителями, {| }} и всеми остальными, кроме {:

const input = `Test block {{section1|val}}
test block
{| class="class1"
some test
|}`;
console.log(input.match(/{{.*?}}|{\|.*?\|}|[^{]+/gs));

Если вы не хотите совмещать начальные / конечные пробелы вне разделителей, измените на

{{.*?}}|{\|.*?\|}|\S[^{]+[^{\s]
                  ^^     ^^^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...