使用正则表达式提取SQL数据

时间:2015-04-09 08:49:37

标签: java regex

我以这种方式获得了不正确的数据。我需要使用正则表达式在点之前和点符号之后提取数据。我正在使用,但我无法获得确切的数据。

String rightHeading=null;
        String leftHeading=null;

String formulaData="ifnull(\"Content Status\".\"Week Of Quarter\",0)";

            Matcher matcher = Pattern.compile("(\"?([^()]*?)\"?)\\.(\"?([@#$%><{}\\w ]*)\"?)").matcher(formulaData);
            while (matcher.find()) 
            {
            String Column_Data=matcher.group(0);
            String[] pieces = Column_Data.split("\\.");
            rightHeading=pieces[0].replace("\"", "");
            leftHeading=pieces[1].replace("\"", "");

             System.out.println(rightHeading+ ": "+leftHeading);
             }//while

我得到的输出是:

   ifnullContent Status.Week Of Quarter,0)

预期产出:

    Content Status.Week Of Quarter

2 个答案:

答案 0 :(得分:1)

以下是我的问题解决方案及其产生的输出。

    String formulaData="(100*(FILTER(\"Fact - Bookings\".\"$ Total Gross Bookings\" USING (\"Booking Date\".\"Year\" =  VALUEOF(\"CUR_YEAR\")))  - FILTER(Fact - Bookings.$ Total Gross BookingsData USING \"Booking Date\".\"Year\" =  VALUEOF(\"PREV_YEAR\") AND  \"Booking Date\".Sortable Number <= VALUEOF(\"PRV_YEAR_TD\") ) ) / FILTER(Fact - Bookings.$TotalGrossBookingsUsage \" USING \"Booking Date\".\"Year\" =  VALUEOF(\"PREV_YEAR\") AND \"Booking Date\".\"Sortable Number\" <= VALUEOF(\"PRV_YEAR_TD\") ) )";

    String p1 = "(\"(\\w*\\s*-*)*?\"\\.\".*?\")|((?:\\()((\\w*\\s*-*)*?\\.\\$\\w+))|(\"(\\w*\\s*-*)*?\"\\.(\\w+\\s+)+)";

    Pattern p = Pattern.compile(p1);
    Matcher m = p.matcher(formulaData);

    while(m.find())
    {
        System.out.println(m.group(0).replaceAll("\"|\\(|\\)", ""));
    }

输出:

Fact - Bookings.$ Total Gross Bookings
Booking Date.Year
Fact - Bookings.$ Total Gross BookingsData
Booking Date.Year
Booking Date.Sortable Number
Fact - Bookings.$TotalGrossBookingsUsage
Booking Date.Year
Booking Date.Sortable Number

正如你所看到的,我没有使用实际上使用一个可怕的复杂正则表达式来解决你的问题。这是因为你的输入太多了,无法有效地使用这个工具。

您的table.field对有时会在其中包含$"个符号,这使得数据非常不一致。正则表达式发现很难处理这种复杂程度,所以我认为我的解决方案(在这个例子中)是可行的。

但是,将来如果您对数据输入有任何控制权,请尝试对其进行清理并尽可能保持一致。

修改 由于这对您没有用,我已经离开并更改了我的代码段以使用正则表达式。

答案 1 :(得分:-1)

Matcher matcher = Pattern.compile("([\\w[\\$#@\\-^&]\\w\\[\\]' $]+)\\.([\\w\\[\\]' $]+)").matcher(formulaData);

while (matcher.lookingAt()) {

                System.out.print("Start index: " + matcher.start());
                System.out.print(" End index: " + matcher.end());
                System.out.println(" Found: " + matcher.group());
            }

lookingAt()在这里更符合要求并且在doc中提到 - lookingAt()尝试将从区域开头开始的输入序列与模式匹配。

与匹配方法一样,此方法始终从区域的开头开始;与该方法不同,它不需要匹配整个区域。

如果匹配成功,则可以通过start,end和group方法获得更多信息。

希望这有帮助。