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

Java 使用正则表达式匹配特定运算符,java,regex,Java,Regex,因此,这是对 我有一根像 INDEX IN('AAA','BBB') 我想这样把它分开 INDEX, IN, ('AAA','BBB') 这是我用的正则表达式 Pattern pattern = Pattern.compile("(.*?)(>=|<=|<>|>|<|BETWEEN|IN|=)(.*)"); 有人能帮我一下正则表达式吗?问题是*?匹配尽可能少的字符,直到第一次出现后续模式,下一个子模式可以匹配中的(和之间的)作为单词的一部分 您不能简单地

因此,这是对

我有一根像

INDEX IN('AAA','BBB')
我想这样把它分开

INDEX, IN, ('AAA','BBB')
这是我用的正则表达式

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

有人能帮我一下正则表达式吗?

问题是
*?
匹配尽可能少的字符,直到第一次出现后续模式,下一个子模式可以匹配
中的
(和
之间的
)作为单词的一部分

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

您可以使用

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

Pattern Pattern=Pattern.compile((*?)([>问题是
*?
匹配的字符尽可能少,直到第一次出现后续模式,下一个子模式可以匹配
中的
(以及
之间的
)作为单词的一部分

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

您可以使用

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

Pattern=Pattern.compile((*?)([>正如您链接的帖子中所建议的,最好的方法是使用特定于域的语言(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] = )

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

正如您链接的帖子中所建议的,最好的方法是使用特定于域的语言(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] = )

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

请注意,正则表达式不适合处理像您这样的不规则问题(似乎是代码)。例如,如果使用
'AAA'
而不是
'AAA'
索引,会发生什么?(这是一个解释过的示例,但除非您知道这些字符串可以包含什么内容,否则您必须始终假设它可能会发生。)使用
Pattern=Pattern.compile((.*)([>请注意,正则表达式不适合处理像您这样的不规则问题(似乎是代码)。例如,如果使用
'AAA'
而不是
'AAA'
之间的索引,会发生什么情况?(这是一个可解释的示例,但除非您知道这些字符串可以包含哪些内容,否则您将始终必须假设它可能发生)。使用
模式=模式。编译((.*)([>