从字符串中删除特定单词

7

假设有一个字符串 = "test20190906.pdf",我该如何使用string.replace或remove删除日期,仅保留“test.pdf”?

考虑到格式始终为文件名+日期+.扩展名。


2
考虑在文件名中提及日期/时间的确切格式。这将有助于生成更好的解决方案。 - Sibgha
3
你只是想删除日期还是所有数字? - Popeye
扩展名是否总是为 .pdf? - Piro
8个回答

10

如果文件名后面紧跟着日期,您可以使用正则表达式删除任何格式中类似于日期连续数字。

"test20190906.pdf".replaceAll("[0-9]{8}\\.", "."));

1
如果您执行类似于"test20190906.pdf".replaceAll("[0-9]{8}\\.", ".")的操作,因为如果文件名称末尾除了日期之外还有数字(例如JavaFinalYear5<date>.txt),则您可能希望保留数字5。这样,您就可以只选择日期,而不选择其他数字。 - KGlasier

5

有很多好的答案,但我想再提供一个。如果文件名不仅包含日期部分的数字,则它将起作用。我假设日期始终出现在扩展名之前并具有固定的长度。

s.replaceAll("\\d{8}\\.pdf", ".pdf");

如果文件扩展名不同,则需要进行一些额外的工作:

public static String removeDate(String s) {
    final String extension = s.substring(s.lastIndexOf("."));
    final String pattern = "\\d{8}\\" + extension;

    return s.replaceAll(pattern, extension);
}

public static void main(String args[])
{
    System.out.println(removeDate("test20190101.pdf"));
    System.out.println(removeDate("123123test20190101.txt"));
    System.out.println(removeDate("123te11st20190101.csv"));
}

这可以仅使用正则表达式完成,但会损失可读性。


2
应该也要转义点号:"\\d{8}\\.pdf" - zwol

4
我查看了之前的答案,但是如果文件名中包含其他数字,例如:01_test20190913.pdf,之前的答案将无法起作用。
这种情况下的解决方案是:
String file = "01_test20190913.pdf";
System.out.println(file.substring(0, file.length() - 12)+".pdf");

我取字符串的前面部分,不包含最后12个字符,并添加“.pdf”后缀。


1
假设日期仅包含数字,您可以使用 regex 替换数字,例如:
String fileNameWithDate = "test20190906.pdf";
String fileName = fileNameWithDate.replaceAll("[0-9]+", ""));
System.out.println(fileName);

1
他想要删除一个日期,而不是所有数字。 - pavelbere

1
如果日期的格式是"yyyyMMdd",那么我建议采用最简单的解决方案,就像@pavelbere提供的一样。但是这个解决方案也假设日期总是附加在文件名的末尾。
String file = "test20190906.pdf"; 
String fileName = file.substring(0, file.length() - 12)+".pdf";

0
string name = "test20190906.pdf"
name.replaceAll("[0-9]","");

0

我的做法是使用正则表达式:(\d{8})(?!.*\d\.)\.,将位于最后一个点旁边并且是8位数字的数值替换为一个点。

String filename = "filename12345678.pdf";
filename = filename.replaceAll("(\\d{8})(?!.*\\d\\.)\\.", ".");

你可以在这里看到它的使用和解释 here
如果日期长度可能不同,请用 * 替换 {8},这将使得日期可以是任意长度。

0
一个不使用正则表达式的答案: 对于原始字符串作为文件名:
l = filename.split('.')
l[-2] = l[-2][:-8]
output = '.'.join(l)

这个方法利用了最后一个“.”总是在扩展名之前的事实,因此在此之前的8个字符将是日期。只要我们删除它们并把“.”放回去,我们就可以得到文件名,而不管扩展名或其前面的字符,而无需使用正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接