【问题标题】:How to pull numbers from a string/file name in Java?如何从 Java 中的字符串/文件名中提取数字?
【发布时间】:2012-08-28 23:40:24
【问题描述】:

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

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

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 中选择的文件

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

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

【问题讨论】:

    标签: java string parsing date


    【解决方案1】:

    确实,您可以使用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}) - 天;
    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) : "";
    }
    

    【讨论】:

    • 看起来不错。我还不确定我想走哪条路;正则表达式或正常拆分。但无论哪种方式,这都是很好的信息。非常感谢!
    【解决方案2】:
    • String.split. 上(它可能需要转义)。以dotSplitString[1]vendor.ven_dor. 之后的部分
    • 在空间 (spaceSplitString) 上拆分该部分。
    • 使用DateFormat.parse(String) 解析第一部分以获得Date
    • 如果存在第二部分(spaceSplitString),请使用Integer.parseInt(spaceSplitString[1])

    【讨论】:

    • 太好了,这基本上就是我想做的事情。感谢您的澄清:D
    • String[1] 将是日期部分而不是供应商部分。随后,Integer.parseInt(string[1]) 会抛出异常。
    • @km1 "String[1] 将是日期部分而不是供应商部分。" 没错。 vendor/ven_dor 字符串似乎没用,所以我的方法忽略它,直接进入日期。
    【解决方案3】:

    Java API String Tokenizer class

    你可以做的是:

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

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

    【讨论】:

      【解决方案4】:

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

      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());
      }
      

      ...等等。

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

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 2018-10-25
        • 2015-09-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 2019-10-15
        相关资源
        最近更新 更多