Регулярное выражение, которое находит все совпадения ${любое выражение}

Следующее регулярное выражение должно найти все совпадения ${any expression}, код выглядит следующим образом:

const reg= /\$\{[^]+\}/g
let txt= '`${i + " test"} RESULT ${2 + 4} now ${i} hi`'
let result= [...txt.matchAll(reg)];
console.log(result)

Как вы заметили, в результате извлекается почти вся строка, правильная операция должна вывести в консоль массив из 3 элементов, который будет содержать ${any expression}

В следующем случае показана ошибка, которая возникает, если я использую: [^}]

const reg= /\$\{[^}]+\}/g
let i= "some"
let txt= `${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`
let txtString= '`${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`'
let result= [...txtString.matchAll(reg)];
console.log(result)
console.log(txt)

выражение ${i + "}" } допустимо в JavaScript, поэтому регулярное выражение должно возвращать [${i + "}" }, other matches], но в показанном примере оно возвращает

${i + "}

Я боюсь, что регулярные выражения недостаточно мощны, чтобы проанализировать произвольное выражение JavaScript.

Marco Bonelli 17.05.2022 05:20

Если вы пытаетесь реализовать интерпретатор JS, я думаю, что регулярное выражение — не лучший инструмент; Однако, если вы пытаетесь что-то сделать с JS литерал шаблона, вы можете попробовать пометить функцию/помеченный шаблон.

Passerby 17.05.2022 07:12
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
2
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы можете описать синтаксис токена внутри ${...}, вы все равно можете использовать регулярное выражение.

Если мы предположим, что

  • Матч начинается с ${
  • Токены внутри могут быть разделены нулем или более пробелами.
  • Токены разделены операторами +, -, * или /.
  • Токены представляют собой либо строки символов слов (буквы, цифры, символы подчеркивания), либо строковые литералы в двойных кавычках ("...\"...\\...")
  • Матч заканчивается }

Затем вы можете использовать

const reg= /\${\s*(?:\w+|"[^"\\]*(?:\\[^][^"\\]*)*")(?:\s*[-+\/*]\s*(?:\w+|"[^"\\]*(?:\\[^][^"\\]*)*"))*\s*}/g

См. демонстрация регулярных выражений.

См. демонстрацию JavaScript:

const token = '(?:\\w+|"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*")';
const op = '[-+/*]';
const reg= new RegExp(String.raw`\${\s*${token}(?:\s*${op}\s*${token})*\s*}`, 'g');
let i= "some"
let txt= `${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`
let txtString= '`${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`'
let result= [...txtString.matchAll(reg)];
console.log(result)
console.log(txt)

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