Разделить строку по совпадению регулярного выражения - PullRequest
2 голосов
/ 06 августа 2020

У меня следующая проблема. Я пытаюсь разбить строку в зависимости от регулярного выражения. Я хочу разделить его на {{ name }}, {{ age }} и т. Д.

Ожидаемый результат должен выглядеть так:

["hy my name is: ", "{{ name }}", " and i am ", "{{ age }}", " old"]

Моя текущая попытка была здесь:

let str = "hy my name is: {{ name }} and i am {{ age }} old";
let vars = str.split(/({{)(.*)(}})/);
console.log(vars);

Какое регулярное выражение подходит для этой задачи?

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Вам необходимо

JS фиксированная демонстрация:

let str = "hy my name is: {{ name }} and i am {{ age }} old";
let vars = str.split(/({{.*?}})/);
console.log(vars);
// => [ "hy my name is: ", "{{ name }}", " and i am ", "{{ age }}", " old"]

Обратите внимание, что { и } являются специальными, только если внутри есть число, например {6}. В {{.*?}} фигурные скобки не могут быть проанализированы как ограничивающие квантификаторы, поскольку нет числа, поэтому вы можете избежать { символов, чтобы предотвратить любую двусмысленность.

Кроме того, если у вас есть совпадение в начале строки у вас будет пустой элемент в результирующем массиве, тогда вам нужно удалить пустые элементы:

str.split(/({{.*?}})/).filter(Boolean)
2 голосов
/ 06 августа 2020

Вместо split вы можете использовать это регулярное выражение с match:

/{{.*?}}|.+?(?={{|$)/g

Код:

let str = "hy my name is: {{ name }} and i am {{ age }} old";
let vars = str.match(/{{.*?}}|.+?(?={{|$)/g);
console.log(vars);

Детали RegEx:

  • {{.*?}}: соответствие строки в пределах {{...}}
  • |: ИЛИ
  • .+?: совпадение 1+ любого символа, который удовлетворяет следующему условию просмотра вперед
  • (?={{|$): условие положительного просмотра вперед, которое гарантирует, что у нас есть увядание {{ или конец строки в следующей позиции
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...