У меня есть некоторые динамические строки с «удобочитаемым форматом» из запросов к базе данных. Мне нужно получить переменные и текущий ценности непосредственно из этих строк. Я никогда раньше не использовал регулярные выражения, поэтому я попытался создать выражение для него, но я застрял.
Вот как выглядят мои строки:
"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
Между переменной Фамилия и значением Доу находится оператор знак равно. Для этого я попытался изменить знак равно на знак равно в выражении, но это не сработало, я попытался поместить между ними | (оператор ИЛИ, насколько я понимаю), например, =|!=, но это тоже не работает. .
Взяв некоторый анализ самого запроса, он формируется:
Этот переменная-оператор-значение может начинаться с символа пробел или ( и заканчиваться символом пробел или ).
Любая идея о том, как я могу построить выражение для него?
Очень сложно сделать одно регулярное выражение.
Это проще и читабельнее
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.+-]+)
См. демонстрация регулярных выражений
\b(\w+)\b
- Группа захвата 1: соответствие последовательности символов слова на границе слова (имя переменной).s*(=|!=|<|<=|>|>=)\s*
- Группа захвата 2: возможные операторы, возможно, отделенные от имени и значения переменной пробелом.(
- Начало группы захвата 3 (значение).(?:\\'|[^'])*'
- Первый вариант: возможно экранированная строка в одинарных кавычках.|
или.(?:NOT\s+)?[\w.+-]+
- Второй вариант: последовательность специальных символов, отличных от пробелов (символы слова, '+', '-', '.'), которым необязательно предшествует НЕ, за которым следует пробел.)
- Конец группы захвата 3.
Это регулярное выражение только для записи.