我以这种方式获得了不正确的数据。我需要使用正则表达式在点之前和点符号之后提取数据。我正在使用,但我无法获得确切的数据。
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
答案 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方法获得更多信息。
希望这有帮助。