所以我试图解析一个包含两个关键组成部分的字符串。一个告诉我时间选择,另一个告诉我位置。
这是文本的样子
KB_H9Oct4GFP_20130305_p00{iiii}t00000{ttt}z001c02.tif
{iiii}
是位置,{ttt}
是计时选项。我需要将
{ttt}
和{iiii}
分开,以便获得完整的文件名:例如,位置1和时间片1 = KB_H9Oct4GFP_20130305_p0000001t000000001z001c02.tif到目前为止,这里是我解析它们的方式:
int startTimeSlice = 1;
int startTile = 1;
String regexTime = "([^{]*)\\{([t]+)\\}(.*)";
Pattern patternTime = Pattern.compile(regexTime);
Matcher matcherTime = patternTime.matcher(filePattern);
if (!matcherTime.find() || matcherTime.groupCount() != 3)
{
throw new IllegalArgumentException("Incorect filePattern: " + filePattern);
}
String timePrefix = matcherTime.group(1);
int tCount = matcherTime.group(2).length();
String timeSuffix = matcherTime.group(3);
String timeMatcher = timePrefix + "%0" + tCount + "d" + timeSuffix;
String timeFileName = String.format(timeMatcher, startTimeSlice);
String regex = "([^{]*)\\{([i]+)\\}(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(timeFileName);
if (!matcher.find() || matcher.groupCount() != 3)
{
throw new IllegalArgumentException("Incorect filePattern: " + filePattern);
}
String prefix = matcher.group(1);
int iCount = matcher.group(2).length();
String suffix = matcher.group(3);
String nameMatcher = prefix + "%0" + iCount + "d" + suffix;
String fileName = String.format(nameMatcher, startTile);
不幸的是,我的代码无法正常工作,并且在检查第二个
matcher
是否在timeFileName
中找到任何内容时失败。在进行第一次正则表达式检查后,它得到以下内容作为
timeFileName
:000000001z001c02.tif
,因此它将切断包括{iiii}
在内的开头部分。不幸的是,我无法假设哪个组先出现(
{iiii}
或{ttt}
),所以我试图设计一个仅先处理{ttt}
然后处理{iiii}
的解决方案。另外,这是我也在尝试解析的有效文本的另一个示例:
F_{iii}_{ttt}.tif
最佳答案
遵循的步骤:
在文件名中找到字符串{ttt ...}
根据字符串中“ t”的编号形成数字格式
在文件名中找到字符串{iiii ...}
根据字符串中“ i”的编号形成数字格式
使用String.replace()方法替换时间和位置
这是代码:
String filePattern = "KB_H9Oct4GFP_20130305_p00{iiii}t00000{ttt}z001c02.tif";
int startTimeSlice = 1;
int startTile = 1;
Pattern patternTime = Pattern.compile("(\\{[t]*\\})");
Matcher matcherTime = patternTime.matcher(filePattern);
if (matcherTime.find()) {
String timePattern = matcherTime.group(0);// {ttt}
NumberFormat timingFormat = new DecimalFormat(timePattern.replaceAll("t", "0")
.substring(1, timePattern.length() - 1));// 000
Pattern patternPosition = Pattern.compile("(\\{[i]*\\})");
Matcher matcherPosition = patternPosition.matcher(filePattern);
if (matcherPosition.find()) {
String positionPattern = matcherPosition.group(0);// {iiii}
NumberFormat positionFormat = new DecimalFormat(positionPattern
.replaceAll("i", "0").substring(1, positionPattern.length() - 1));// 0000
System.out.println(filePattern.replace(timePattern,
timingFormat.format(startTimeSlice)).replace(positionPattern,
positionFormat.format(startTile)));
}
}