我以这种方式得到了不正确的数据。我需要使用正则表达式提取点符号之前和点符号之后的数据。我正在使用,但无法获得准确的数据。
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
最佳答案
下面是我针对您的问题的解决方案,以及它产生的输出。
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
对有时会在其中包含 $
或 "
符号,这使得数据非常不一致。正则表达式很难处理这种复杂程度,所以我认为我的解决方案(在本示例中)是可行的。
但是,将来如果您对数据输入有任何控制权,请尝试对其进行清理并使其尽可能一致。
编辑 由于这对您不起作用,因此我更改了代码片段以使用正则表达式。
关于java - 使用正则表达式提取SQL数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29533888/