使用正则表达式匹配特定运算符

时间:2019-03-20 13:57:46

标签: java regex

这是Splitting strings when argument exists in different forms in the input

的后续活动

我有一个类似

的字符串
INDEX IN('AAA','BBB')

我想这样分割它,

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

这是我正在使用的正则表达式,

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

这是我得到的结果,

IN , DEX IN'AAA','BBB'

有人可以帮我一些正则表达式吗?

2 个答案:

答案 0 :(得分:0)

问题在于,.*?匹配的字符尽可能少,直到后续模式的第一次出现为止,而下一个子模式可以匹配IN(和BETWEEN)作为一部分一个字。

您不能简单地在第2组周围添加单词边界,因为带有单词边界的非单词字符在非单词上下文中将不匹配。

您可以使用修复正则表达式

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

请参见regex demo

详细信息

  • (.*?)-第1组:除换行符以外的任何0+个字符,并且尽可能少
  • ([><]=|<>|[><=]|\\b(?:BETWEEN|IN)\\b)-><,然后=<><>,{{ 1}}或=BETWEEN作为整个单词
  • IN-第3组:尽可能多的除换行符以外的0+个字符

答案 1 :(得分:0)

如您已链接Splitting strings when argument exists in different forms in the input的帖子中所建议的那样,最好的方法是使用特定域语言(DSL),例如ANTLR或JavaCC。

例如,一个非常简单的ANTLR4语法,如下所示:

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

在解析您的输入时,将产生具有以下TreeNode的一棵Tree:

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] = )

因此您可以在方便时重新组织您的输入。