Как получить переменные и значения из строки с помощью регулярных выражений

У меня есть некоторые динамические строки с «удобочитаемым форматом» из запросов к базе данных. Мне нужно получить переменные и текущий ценности непосредственно из этих строк. Я никогда раньше не использовал регулярные выражения, поэтому я попытался создать выражение для него, но я застрял.

Вот как выглядят мои строки:

"NOT (Name = John AND Date = 08.04.2022 AND (Status = Not active OR Status = Iddle) OR Surname != Doe)"

Я пробую несколько выражений без успеха, и это уникальное, у меня есть некоторые результаты:

/\w*\ \=\ \w*/ig

Он возвращает следующие правильные совпадения:

Name = John
Status = Iddle

И эти правильные (но неполные) совпадения:

Date = 08
Status = Not

Между переменной Фамилия и значением Доу находится оператор знак равно. Для этого я попытался изменить знак равно на знак равно в выражении, но это не сработало, я попытался поместить между ними | (оператор ИЛИ, насколько я понимаю), например, =|!=, но это тоже не работает. .

Взяв некоторый анализ самого запроса, он формируется:

  1. Переменная (любое слово, символ, символ может содержать пробелы или их сочетание)
  2. пробел
  3. Оператор (=, !=, <, <=, >=)
  4. пробел
  5. Значение (то же, что и переменные)

Этот переменная-оператор-значение может начинаться с символа пробел или ( и заканчиваться символом пробел или ).

Любая идея о том, как я могу построить выражение для него?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Очень сложно сделать одно регулярное выражение.

Это проще и читабельнее

const str = "NOT (Name = John AND Date = 08.04.2022 AND (Status = Not active OR Status = Idle) OR Surname != Doe)"
const statements = str
  .replace(/[()]/g,"")                    // ( or )
  .split(/ AND | OR |\s?NOT/)             // AND OR NOT with optional space to handle the first NOT
  .filter(word => word.includes("="))     // get rid of all the fluff
const namePairs = statements.map(statement => {
  const parts = statement.split(/ !?= /)  // = or !=
  return { [parts[0].trim()]: parts[1].trim() }
})
console.log(namePairs)
Ответ принят как подходящий

Есть много вариантов значений. Следующее регулярное выражение без учета регистра должно быть для вас началом и распознает строки в одинарных кавычках (которые могут содержать встроенные одинарные кавычки, если экранированы обратной косой чертой) или любое другое значение, которое представляет собой последовательность специальных символов без пробелов для обработки идентификаторов и числа. Он также обрабатывает случай, когда значению предшествует NOT (без учета регистра) для логических значений:

\b(\w+)\b\s*(=|!=|<|<=|>|>=)\s*('(?:\\'|[^'])*'|(?:NOT\s+)?[\w.+-]+)

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

  1. \b(\w+)\b - Группа захвата 1: соответствие последовательности символов слова на границе слова (имя переменной).
  2. s*(=|!=|<|<=|>|>=)\s* - Группа захвата 2: возможные операторы, возможно, отделенные от имени и значения переменной пробелом.
  3. ( - Начало группы захвата 3 (значение).
  4. (?:\\'|[^'])*' - Первый вариант: возможно экранированная строка в одинарных кавычках.
  5. | или.
  6. (?:NOT\s+)?[\w.+-]+ - Второй вариант: последовательность специальных символов, отличных от пробелов (символы слова, '+', '-', '.'), которым необязательно предшествует НЕ, за которым следует пробел.
  7. ) - Конец группы захвата 3.

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

mplungjan 09.04.2022 20:52

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