java - 使用正则表达式在两个字符之一之前提取子字符串
问题描述
所以我有一个初始文件集:
file1.txt
file2.txt
当我对这些文件进行更改并保存它们时,我会给它们附加一个时间戳,所以它们会变成:
fileN_DD-Mon-YYYY_HHMMSS.txt
但如果我要进行任何额外的保存,时间戳将开始堆叠:
fileN_DD-Mon-YYYY_HHMMSS_DD-Mon-YYYY_HHMMSS.txt
我需要一种方法来获取在第一次出现“。”之前出现的子字符串。或“_”获取它们之前的字符串(即,实际文件名(“fileN”))。
我已经到了这一点
int lastDot = fileName.getName().lastIndexOf('.');
String renamed = fileName.getName().substring(0,lastDot) + getDateTime() + fileName.getName().substring(lastDot);
我尝试使用 Scanner::useDelimiter 来获得“。”的第一次出现。或“_”使用正则表达式但没有运气。
String renamed = savedFileName(fileName)
public static String savedFileName(String fileName) {
final String TXT = ".txt";
Scanner s = new Scanner(fileName);
s.useDelimiter(<regex>);
String trueFileName = s.next();
s.close();
return trueFileName + getDateTime() + TXT;
对于正则表达式,我试过了"\\W"
,但它只返回最新的时间戳:
_DD-Mon-YYYY_HHMMSS.txt
,".|_"
但这会返回这个怪物:
fileN.txt_DD-Mon-YYYY.txt_(more timestamps).txt.
解决方案
您可以将String
'split
方法与正则表达式模式一起使用\.|_
:
String longFile = "fileN_DD-Mon-YYYY_HHMMSS.txt";
String shortFile = "file1.txt ";
String pattern = "\\.|_"; // need to escape backslash
System.out.println(longFile.split(pattern)[0]);
System.out.println(shortFile.split(pattern)[0]);
或者,等效地,正则表达式[._]
。
输出:
fileN
file1
推荐阅读
- html - 滚动显示的父级:当孩子的 grid-row-start 更改时,grid 意外滚动
- vue.js - 从'vue'与'@vue/reactivity'导入{ref}之间的区别?
- powershell - 如何自动化 Winodow 服务和 WebApplication 部署
- python - 代码示例,任何帮助调试将不胜感激
- python - DeserializationError:无法反序列化内容类型:文本/纯文本
- java - Spring批处理处理大型机二进制文件
- angular - Angular Karma:从 Angular v8 升级到 v12 后 await fixture.whenStable 总是超时
- c++ - 有没有更好的方法在 VS Code 中设置 C++ 格式选项,而不是将它们打包成一个长字符串?
- scala - Parquet 文件被读取为空
- javascript - IE11 axios数据响应问题(含随机字符串)