Соответствие конкретного оператора с помощью регулярных выражений - PullRequest
1 голос
/ 20 марта 2019

Так что это продолжение Разделение строк, когда аргумент существует в различных формах во входных данных

У меня есть строка типа

INDEX IN('AAA','BBB')

Я бы хотел разделить это так,

INDEX, IN, ('AAA','BBB')

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

Pattern pattern = Pattern.compile("(.*?)(>=|<=|<>|>|<|BETWEEN|IN|=)(.*)");

Это результат, который я получаю,

IN , DEX IN'AAA','BBB'

Может кто-нибудь немного помочь мне с моим регулярным выражением?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Как предложено в посте, который вы связали Разделение строк, когда аргумент существует во входных данных в различных формах , наилучшим подходом было бы использование языка, специфичного для домена (DSL), такого как ANTLR или JavaCC.

Например, очень простая грамматика ANTLR4, подобная следующей:

grammar simpleTest
start : 'INDEX' 'IN' '(' '\'' .*? '\'' ',' '\'' .*? '\''  ')';

при анализе вашего ввода выдает одно дерево со следующими узлами дерева:

TreeChildNode[0]  = INDEX
TreeChildNode[1]  = IN
TreeChildNode[2]  = (
TreeChildNode[3]  = '
TreeChildNode[4]  = AAA // AAA could any sequence of char of any length
TreeChildNode[5]  = '
TreeChildNode[6]  = ,
TreeChildNode[7]  = '
TreeChildNode[8]  = BBB // BBB could any sequence of char of any length
TreeChildNode[9]  = '
TreeChildNode[10] = )

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

0 голосов
/ 20 марта 2019

Проблема в том, что .*? соответствует как можно меньшему числу символов до первого вхождения последующих шаблонов, а следующий подшаблон может соответствовать INBETWEEN) как часть слова.

Вы не можете просто добавить границы слов вокруг группы 2, так как несловарные символы с границами слов вокруг них не будут совпадать в несловесном контексте.

Вы можете исправить регулярное выражение, используя

Pattern pattern = Pattern.compile("(.*?)([><]=|<>|[><=]|\\b(?:BETWEEN|IN)\\b)(.*)");

См. Демонстрационную версию regex .

Подробности

  • (.*?) - Группа 1: любая 0+символы, отличные от символов разрыва строки, как можно меньше
  • ([><]=|<>|[><=]|\\b(?:BETWEEN|IN)\\b) - > или <, а затем =, или <>, или <, >, = или BETWEEN или IN как целые слова
  • (.*) - Группа 3: любые 0+ символов, кроме символов разрыва строки, максимально возможное количество
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...