如何从Java中的字符串/文件名中提取数字?

时间:2012-08-28 23:40:25

标签: java string parsing date

希望有人可以帮助我......或者至少指出我正确的方向。

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

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()获取这些作为字符串;其中'file'是JFileChooser中选定的文件

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

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

4 个答案:

答案 0 :(得分:3)

确实,您可以使用regular expression

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}) - Day;
  5. (\\d?) - 匹配可选的(?)最后一位数。
  6. 如果要将日期部分解析为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) : "";
    }
    

答案 1 :(得分:1)

    String.split上的
  • .(可能需要转义)。将dotSplitString[1]作为vendor.ven_dor.
  • 之后的部分
  • 将该部分拆分为空格spaceSplitString)。
  • 使用DateFormat.parse(String)解析第一部分以获得Date
  • 如果(spaceSplitString)的第二部分存在,请使用Integer.parseInt(spaceSplitString[1])

答案 2 :(得分:0)

Java API String Tokenizer class

你能做的是:

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

你得到的照片,或者你也可以使用扫描仪来解析它

答案 3 :(得分:0)

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

StringTokenizer tok = new StringTokenizer(filename,".-");  //tokenizes both on '.' and '-'
String name = tok.nextToken();
int year = Integer.parseInt(tok.nextToken());
int month = Integer.parseInt(tok.nextToken());
int day = Integer.parseInt(tok.nextToken());
int cnt = 1; //default one copy of the file
if(tok.hasMoreTokens()){
     cnt = Integer.parseInt(tok.nextToken());
}

......等等。

然而,我赞同使用上面的正则表达式解决方案,不仅仅是因为它对外行人来说看起来不那么容易理解。为了完整性,请在此处加入。