使用正则表达式在两个字符之一之前提取子字符串

Extracting a substring before one of two characters using regex

提问人:biscuitduke 提问时间:7/14/2020 更新时间:7/14/2020 访问量:284

问:

所以我有一个初始文件集:

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.
则表达式 java.util.scanner

评论


答:

0赞 jdaz 7/14/2020 #1

你可以将 的方法与正则表达式模式一起使用:Stringsplit\.|_

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