在java中动态替换字符串的内容

在java中动态替换字符串的内容,java,string,replace,Java,String,Replace,我有一个 String name = " abc_efg_the_xyz_24_Mar_2016.csv "; 我想用“2016年1月18日”取代2016年3月24日。使新字符串变为: "abc_efg_the_xyz_18_Jan_2016.csv" 我怎么做 还有一个问题是,字符串名称中的日期部分将始终不断更改,因此我无法进行模式搜索并替换为新日期 请帮忙你在问两件事。第一个问题的答案是: String name = " abc_efg_the_xyz_24_Mar_2016.csv

我有一个

String name = " abc_efg_the_xyz_24_Mar_2016.csv "; 
我想用
“2016年1月18日”
取代
2016年3月24日
。使新字符串变为:

"abc_efg_the_xyz_18_Jan_2016.csv" 
我怎么做

还有一个问题是,字符串名称中的日期部分将始终不断更改,因此我无法进行模式搜索并替换为新日期


请帮忙

你在问两件事。第一个问题的答案是:

String name = " abc_efg_the_xyz_24_Mar_2016.csv ";
String olddate = "24_Mar_2016";
String newdate = "18_Jan_2016";

// use replaceAll() if there will be multiple occurences the date
String replaced = name.replace(olddate, newdate);
第二个问题需要与命名约定使用的日期格式匹配的正则表达式。

方法之一:

String name = " abc_efg_the_xyz_24_Mar_2016.csv ";
name = name.replace("24_Mar_2016", "18_Jan_2016"); 
可以使用和
Matcher
来删除旧日期


但我认为你无论如何都会创建一个新文件,然后你也会知道在日期之前要使用的前缀。因此,我认为没有必要“更改”旧文件名…

我假设您的
名称中始终有相同的日期格式和日期字符串的位置,但是
名称中的日期值可能不同

String name = "abc_efg_the_xyz_24_Mar_2016.csv";
System.out.println(name.replaceFirst(".{11}(?=[.][^.]+$)","Happy_NEW_YEAR"));
这将打印:

abc_efg_the_xyz_Happy_NEW_YEAR.csv
  • “{11}(?=[.][^.]+$)”
    是正则表达式,以匹配最后一个句点(
    )之前的11个字符,在您的情况下,它匹配日期格式xx\u xxx\u xxxx(长度:11)

  • replaceFirst
    只执行一次替换。我没有使用模式
    \d{2}\w{3}\u\d{4}
    ,因为我看到您的字符串中有其他
    abc\u efg…
    ,我不确定是否有相同的匹配模式,您不想替换


假设您的日期始终具有以下约定:dd\u mmm\u yyyy,并且文件的名称只有一个日期。您可以使用or和regex来解决此问题。阅读更多关于正则表达式的信息


这是一个

也许你应该在文件中添加子字符串,就像总是先使用X字符,然后添加你的新日期一样<代码>var actualFileName=“xxx\u xxx\u date.csv”;var tmp=actualFileName.substring(0,7)//不确定它是否像var final=tmp+“yournewDate”+“.csv”你说的“将始终保持更改”是什么意思?它是否始终位于文件名的最后一部分?你听说过
正则表达式吗?尽管如此,在你们的例子中,当你们知道一个子串从一个字符串的开始或结束的位置时,你们可以用索引来代替它。当然,您不必将字符串硬编码为模式。你可以从运行时拉到一起的字符串中构建一个模式。然后,另一件事:到目前为止你自己做了哪些尝试?Offtopic:谢谢你对我的junit答案进行编辑。我进一步增强了它,但我喜欢你的想法。
String replaceDate = "12_Feb_2017";
String name = "abc_efg_the_xyz_24_Mar_2016.csv ";

name = name.replaceAll("\\d{2}_[a-zA-Z]{3}_\\d{4}", replaceDate);