正则表达式获取文件名

时间:2015-05-06 23:41:00

标签: java regex

我想从完整的文件名+时间戳中仅提取文件名。下面是输入。

    String filePath = "fileName1_20150108.csv";

预期输出应为:" fileName1 "

    String filePath2 = "fileName1_filedesc1_20150108_002_20150109013841.csv"

预期输出应为:" fileName1_filedesc1 "

我在java中编写了一个下面的代码来获取文件名,但它适用于第一部分(filePath)但不适用于filepath2。

Pattern pattern = Pattern.compile(".*.(?=_)");
        String filePath = "fileName1_20150108.csv";
        String filePath2 = "fileName1_filedesc1_20150108_002_20150109013841.csv";
         Matcher matcher = pattern.matcher(filePath);
         while (matcher.find()) {
              System.out.print("Start index: " + matcher.start());
              System.out.print(" End index: " + matcher.end() + " ");
              System.out.println(matcher.group());
            }

有人可以帮我纠正正则表达式,这样我就可以使用相同的正则表达式解析两个文件路径吗? 感谢

3 个答案:

答案 0 :(得分:1)

锚定开头,并使.*非贪婪:

^.*?(_\D.*?)?(?=[_.])

更新:将第二个组(对于fileDesc)更改为可选,并强制它以非数字字符开头。只要您的fileDesc字符串从不以数字开头,这将有效。

答案 1 :(得分:0)

您可以在第一个下划线之前获得字符,第一个下划线,然后是字符,直到下一个下划线:

^[^_]*_[^_]*

答案 2 :(得分:0)

这应该有效:"^(.*?)_([0-9_]*)\\.([^.]*)$"

它将返回3组:

  • 基本名称(假设不是单个部分将是所有数字)
  • 时间戳信息
  • 扩展名。

你可以在这里测试:http://fiddle.re/v0hne6(RegexPlanet)