首页 > 解决方案 > 使用正则表达式在两个字符之一之前提取子字符串

问题描述

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

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.

标签: javaregexjava.util.scanner

解决方案


您可以将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

推荐阅读