0

希望有人可以帮助我解决这个问题..或者至少为我指明正确的方向。

首先,我有一堆名称如下的文件:

vendor.2012-07-25
vendor.2012-07-25 2
ven_dor.2012-05-18
ven_dor.2012-05-18 2

基本上是一个供应商名称(有时一个单词,有时两个带下划线)+(句点“.”)+(年)+(月)+(日)。年、月、日用 (-) 分隔。可能有多个同名文件,在日期后用 2/3/4 等表示。

我通过执行 file.getName(); 将这些作为字符串获取 其中“文件”是从 JFileChooser 中选择的文件

然后我需要根据日期绘制一些数据。我应该尝试用“。”分割初始文件名字符串吗?首先,将供应商和日期分开,然后用“-”拆分/划分剩余部分以获得年/月/日的单独值?

我在想这可能是一个正则表达式的事情,但我在那个领域很弱......所以我想出了双重分裂。有人有意见或建议吗?谢谢!

4

4 回答 4

3

实际上,您可以使用正则表达式

String s = "vendor.2012-07-25 2";
Pattern p = Pattern.compile("([^.]+)\\.(\\d{4})-(\\d{2})-(\\d{2}) ?(\\d?)");
Matcher m = p.matcher(s);
if (m.find()) {
  String vendorName = m.group(1);
  String year = m.group(2);
  String month = m.group(3);
  String day = m.group(4);
  String multipleFiles = m.groupCount() > 4 ? m.group(5) : "";
  System.out.printf("%s %s %s %s %s", vendorName, year, month, day, multipleFiles);
}

每个用括号包裹的表达式()称为一个捕获组,它基本上告诉正则表达式引擎保存其内容,以便以后可以检索它。

总之,这是每个捕获组所做的事情:

  1. ([^.]+)- 除了点 ( .) 之外的所有内容,因此我们基本上捕获了供应商名称部分;
  2. (\\d{4})-\d匹配一个数字。\d{4}匹配4数字(年份);
  3. (\\d{2})- 月;
  4. (\\d{2})- 天;
  5. (\\d?)- 匹配可选的 ( ?) 最后一位数字。

如果要将日期部分解析为java.Util.Date实例,可以为其使用单个捕获组,然后使用SimpleDateFormat

Pattern p = Pattern.compile("([^.]+)\\.(\\d{4}-\\d{2}-\\d{2}) ?(\\d?)");
Matcher m = p.matcher(s);
if (m.find()) {
  String vendorName = m.group(1);
  String dateString = m.group(2);
  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  String multipleFiles = m.groupCount() > 2 ? m.group(3) : "";
}
于 2012-08-28T23:45:47.123 回答
1
  • String.split.(它可能需要转义)。将视为ordotSplitString[1]之后的部分vendor.ven_dor.
  • 在空格( spaceSplitString) 上拆分该部分。
  • 使用解析第一部分DateFormat.parse(String)得到一个Date
  • 如果(的)的第二部分spaceSplitString存在,请使用Integer.parseInt(spaceSplitString[1])
于 2012-08-28T23:45:33.150 回答
0

Java API 字符串标记器类

你可以做的是:

tokenizer = new StringTokenizer(file.getName(), ".");
tokenizer.nextElement();

你得到了图片,或者你也可以使用 Scanner 来解析它

于 2012-08-28T23:47:04.950 回答
0

我倾向于在我的代码中大量使用 StringTokenizers。要标记上面的示例,您可以使用类似于以下内容的内容:

StringTokenizer tok = new StringTokenizer(filename,".-"); //在'.'上标记两者 和 '-'
字符串名称 = tok.nextToken();
int year = Integer.parseInt(tok.nextToken());
int 月 = Integer.parseInt(tok.nextToken());
int day = Integer.parseInt(tok.nextToken());
int cnt = 1; //默认一份文件
如果(tok.hasMoreTokens()){
     cnt = Integer.parseInt(tok.nextToken());
}

...等等。

但是,我赞同使用上面的正则表达式解决方案,这不仅是因为它对于外行来说看起来不太容易理解。为了完整起见,仅将其包括在这里。

于 2012-08-29T00:16:58.743 回答