Java 如何用单词分割字符串,但不能使用撇号

Java 如何用单词分割字符串,但不能使用撇号,java,regex,Java,Regex,我有一种SQL查询,我想用“AND”和“OR”来分割。问题是这些关键字可能以撇号或引号的形式出现在查询中 例如,以下查询: attribute1 IS 'test AND attribute2 IS NOT 'test' AND attribute2 IN ('me and you', 'me or you') 应按如下方式进行拆分: attribute1 IS 'test attribute2 IS NOT 'test' attribute2 IN ('me and you', "me or

我有一种SQL查询,我想用“AND”和“OR”来分割。问题是这些关键字可能以撇号或引号的形式出现在查询中

例如,以下查询:

attribute1 IS 'test AND attribute2 IS NOT 'test' AND attribute2 IN ('me and you', 'me or you')
应按如下方式进行拆分:

attribute1 IS 'test
attribute2 IS NOT 'test'
attribute2 IN ('me and you', "me or you")
所以基本上,撇号或引号中的任何字符串(“我和你”,“我或你”)都不应该被处理。 我怎么能用一个正则表达式做到这一点?实际上是两个,一个用“或”分开,另一个用“和”分开

提前感谢您的帮助!
Mariusz

正如Wiktor所说,编写自己的解析器。尝试使用单个正则表达式执行此操作可能会导致难以读取和维护代码

然而正则表达式可能有助于大幅减少您自己的解析器编码。尝试这里描述的方法:(文章很长,您可能希望直接跳到Match Tarzan,而不是“Tarzan”部分)

简言之:使用以下表达式:

'.*?'|".*?"|(AND|OR)
演示(寻找绿色亮点):。注意:演示中的表达式比
'.?'|“*?”|(和|或)
稍微复杂一些,因为我只是想通过后者更清楚地概括出想法

然后在Java代码中找到定义了
group(1)
的所有匹配项。引号中的and和OR将包含在前两个备选方案中,且不会被小组捕获。现在您只需使用已定义的
组(1)
的匹配项的
start()
end()
索引拆分输入字符串:

Pattern-Pattern=Pattern.compile(“'.*?\'\\s*\\b(和或)\\b\\s*”,Pattern.Pattern不区分大小写);
Matcher Matcher=pattern.Matcher(输入);
int nextPartPos=0;
while(matcher.find()){
if(匹配器组(1)!=null){
System.out.println(input.substring(nextPartPos,matcher.start());
nextPartPos=matcher.end();

System.out.println(“-->”+matcher.group(1)+“正如Wiktor所说的,编写您自己的解析器。尝试使用单个正则表达式进行解析可能会导致难以读取和维护代码

但是正则表达式可能有助于大幅减少您自己的解析器编码。请尝试下面描述的方法:(文章很长,您可能希望直接跳到匹配泰山部分,而不是“泰山”部分)

简言之:使用以下表达式:

'.*?'|".*?"|(AND|OR)
演示(寻找绿色亮点):.NB:演示中的表达式比
'.'|?“*?”|(和|或)
稍微复杂一些,因为我只是想通过后者更清楚地概述想法

然后在Java代码中找到定义了
group(1)
的所有匹配项。引号中的and和OR将包含在前两个选项中,并且不会被组捕获。现在您只需使用定义了
group(1)
的匹配项的
start()
end()
索引拆分输入字符串即可:

Pattern-Pattern=Pattern.compile(“'.*?\'\\s*\\b(和或)\\b\\s*”,Pattern.Pattern不区分大小写);
Matcher Matcher=pattern.Matcher(输入);
int nextPartPos=0;
while(matcher.find()){
if(匹配器组(1)!=null){
System.out.println(input.substring(nextPartPos,matcher.start());
nextPartPos=matcher.end();

System.out.println(“-->”+matcher.group(1)+”因为第一次
”测试
没有结束引号,所以
和之后的
也在单引号内。
str.split(\\s+(或|和)\\s+)
@AvinashRaj:如果文本是
attribute1是'test AND test2 AND attribute2…
,第一项是
attribute1是'test AND test2
,这将不起作用。Mariuszu,编写您自己的解析器。我认为@AvinashRaj解决方案应该起作用,只要
不在引号内。括号将起作用但是要混淆它。因为第一个
“测试”
没有结束引号,所以
和之后的
也在单引号内。
str.split(\\s+(或| AND)\\s+)
@AvinashRaj:如果文本是
attribute1是'test AND test2 AND attribute2…
,第一项是
attribute1是'test AND test2
,这将不起作用。Mariuszu,编写您自己的解析器。我认为@AvinashRaj解决方案应该起作用,只要
不在引号内。括号将起作用不过,把它弄糊涂了。