通过java regex在SQL语句中提取AND条件

时间:2018-03-30 11:07:41

标签: java sql regex

我希望在sql语句中获得sql and条件

输入:

And tbl.col1='Jim And Tom' and tbl.col2 like '%Test' AND tbl.col3 >='2018-12-12' And tbl.col4 Like 'what's this'

预期输出

tbl.col1='Jim And Tom'

tbl.col2 like '%Test'

tbl.col3 >='2018-12-12'

tbl.col4 Like 'what's this'

顺便说一句,我已经尝试过java拆分来执行此操作,但如果关键字包含and,则无法正常工作

String[] subFilters = Pattern.compile("\\s*and\\s*",Pattern.CASE_INSENSITIVE).split(filter);

如果可以通过java regex获得输出?

1 个答案:

答案 0 :(得分:0)

试试这个:

String s = "And condition 1 here and tbl.col2 like '%Test' AND tbl.col3 >='2018-12-12' And tbl.col4 Like 'what\\'s this'";

s = s.trim();
s = s.substring(3).trim();

boolean exclude = false;

s = s + " and";

String str = "";

for(int i = 0; i < s.length()-3; i++)
{
    if( s.charAt(i) == '\'' && !(s.charAt(i-1) == '\\') )
    {
        exclude = !exclude;
    }

    if((!s.substring(i, i+3).equalsIgnoreCase("and") || exclude) && (i != s.length()-4))
    {
        str += s.charAt(i);
    }
    else
    {
        System.out.println(str);
        str = "";
        i += 3;
    }
}

注意 - 上述代码几乎适用于任何条件类型,但正如Wiktor在评论中提到的那样,您需要使用'what\\'s this'代替{{1} }

说明 -

当排除为'what's this'时,表示正在检查的字母(实质上是单词)在''内。因此,true会在''中存储任意和所有字符,包括臭名昭着的str

and表示正在检查和存储的字符将是字符串结尾的三个字母之前的字符。这很重要,因为我们之前添加了i < s.length() - 3" and"

现在,如果s上的字母为i,且前面没有',则\的值会反转,即如果系统正在被告知包括所有单词,甚至exclude,然后现在被告知不要。因此,使用此方法捕获引文中的任何and

and是一种非常乏味的方式,可以说如果该字母不属于if((!s.substring(i, i+3).equalsIgnoreCase("and") || exclude) && (i != s.length()-4)) 分隔符,(或者如果是最后条件的最后一个字母),然后它应存储在and

输入可能的最佳解释非常困难,但我确定如果你阅读的代码很长很难,那么你会更好地理解它。