Я пытаюсь придумать регулярное выражение, которое будет по крупицам сопоставлять компоненты запроса PQL. Несколько примеров того, что я имею в виду:
a==
[('a==')]
a==22
[('a==22')]
a=="b"
[('a=="b"')]
a=="b" and/or/not <- any of these
[('a=="b"', '{logical operator}')]
a=="b" or c.
[('a=="b"', 'or'), ('c.')]
a=="b" or c.d
[('a=="b"', 'or'), ('c.d')]
a=='b' and c=="
[("a=='b'", 'and'), ('c=="')]
По сути, всякий раз, когда вводится новый раздел оператора PQL, мы создаем новое совпадение, и оно работает с запросами строк или чисел.
Мое текущее выражение выглядит так:
([a-zA-Z.\-_]+[=!<>]{0,2}([\"\']?[a-zA-Z\-!._ "\']*?[\"\']|[0-9]*))[ ]?(and|or|not)?[ ]?
Он делает хорошую работу, но терпит неудачу в чем-то вроде этого:
a==22 and b=='c
Он считает, что c
относится к новому совпадению, что дает следующее:
[('a==22', '22', 'and'), ('b==', "'"), ('c')]
В отличие от
[('a==22', '22', 'and'), ('b==', "'c")]