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

Java 使用正则表达式提取SQL数据,java,regex,Java,Regex,我用这种方法得到了不正确的数据。我需要使用正则表达式提取点符号前后的数据。我正在使用,但我无法获得准确的数据 String rightHeading=null; String leftHeading=null; String formulaData="ifnull(\"Content Status\".\"Week Of Quarter\",0)"; Matcher matcher = Pattern.compile("(\"?([^()]*?)\"?

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

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
预期产出:

    Content Status.Week Of Quarter
lookingAt()根据要求和文件中提到的,在这里更合适-- lookingAt()尝试根据模式匹配输入序列,从区域的开头开始

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

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


希望这有帮助。

下面是我对您的问题的解决方案,以及它产生的输出

    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("\"|\\(|\\)", ""));
    }
正如你所看到的,我并没有使用非常复杂的正则表达式来解决你的问题。这是因为您的输入太多,无法有效地使用此工具

事实上,您的
表.field
对中有时包含
$
符号,这使得数据非常不一致。正则表达式发现很难处理这种复杂程度,因此我认为我的解决方案(在本例中)是可行的

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

编辑
因为这对你来说没有用,所以我已经改变了我的代码片段来使用正则表达式。< /P>你的正则表达式的当前输出是什么?我编辑了代码,请你提供一个数据样本和你想提取什么?检查我的更新@ RossiarDid Rossiar的帮助帮助吗?如果是的话,请考虑一下投票。/或者接受他的答案。但是对于动态数据,我们不能使用字符串进行拆分。动态数据可以有数千行。因此,如果我们使用正则表达式,它可以得到格式。你能将数据标准化吗?很难找到带有空格、$和“在一个点之后,没有明确定义正则表达式的结束点。请参阅m updated formulaData string,如果我将您的代码与该字符串一起使用,我将获得输出字符串formulaData=“ifnull(\“Content Status\”\“Week Of quarty\”,0)”;是的,我知道我的解决方案没有按您希望的方式工作。这些数据来自哪里?
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());
            }
    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