Regex для обнаружения вложенных тегов

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

  • {{text to replace::S}} — простой тег, встроенная замена текста.
  • {{content to include::C}} — тег выбора, позволяет пользователю включать или нет содержимое тега.
  • {{option 1 / option 2::A}} – альтернативный тег, позволяет пользователю выбирать между вариантом 1 и вариантом 2.

Я без проблем работал с ними и обнаружил их с помощью выражения RegeX /\{\{([^:]+)::([S|C|R|A])\}\}/g

Я хочу ввести вложенные теги на максимальном уровне 1, и вот в чем проблема. Я пробовал несколько подходов.

Первый подход Попробуйте здесь

/\{\{([^{]+(?:\{\{[^{}]*\}\})?)::([S|C|R|A])\}\}/g это позволяет мне обнаружить только один вложенный тег, но, как вы можете видеть, у альтернативного тега с ним проблемы.

Второй подход Попробуйте здесь

/\{\{(.+(?:\{\{[^{}]*\}\})?)::([S|C|R|A])\}\}/g это обнаруживает несколько вложенных тегов, но когда в тексте есть несколько тегов, он ломается.

Любая помощь?

Регулярные выражения не подходят для обработки вложенных шаблонов.

Barmar 11.07.2024 17:05

@Barmar нашел решение. Я считаю, что это будет тот случай, когда уровень вложенности превышает 2. В моем случае он ограничен 1.

Filipe Nóbrega 11.07.2024 18:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашёл решение: /\{\{([^{}]*(?:\{\{[^{}]*\}\}[^{}]*)*)::([SCRA])\}\}/g

Я не понимаю, как это можно использовать для анализа вложенных структур, таких как ... {{... {{...::A}} ...::A}} ... {{... {{... {{...::A}} ...::A}} ...::A}} .... Если не использовать анализатор LL и анализатор деревьев, вы можете использовать регулярные выражения, если временно аннотируете уровень вложенности. Подробности смотрите на twiki.org/cgi-bin/view/Blog/BlogEntry201109x3

Peter Thoeny 13.07.2024 03:33

@PeterThoeny, я не могу, в моем случае использования, когда уровень вложенности всегда <= 1, это работает. Эту деталь я уточню в вопросе.

Filipe Nóbrega 15.07.2024 14:49

Другие вопросы по теме