我想从完整的文件名+时间戳中仅提取文件名。下面是输入。
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());
}
有人可以帮我纠正正则表达式,这样我就可以使用相同的正则表达式解析两个文件路径吗? 感谢
答案 0 :(得分:1)
锚定开头,并使.*
非贪婪:
^.*?(_\D.*?)?(?=[_.])
更新:将第二个组(对于fileDesc
)更改为可选,并强制它以非数字字符开头。只要您的fileDesc
字符串从不以数字开头,这将有效。
答案 1 :(得分:0)
您可以在第一个下划线之前获得字符,第一个下划线,然后是字符,直到下一个下划线:
^[^_]*_[^_]*
答案 2 :(得分:0)
这应该有效:"^(.*?)_([0-9_]*)\\.([^.]*)$"
它将返回3组:
你可以在这里测试:http://fiddle.re/v0hne6(RegexPlanet)