这是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'
有人可以帮我一些正则表达式吗?
答案 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] = )
因此您可以在方便时重新组织您的输入。