鉴于此字符串 1990January20hello.abc ,我想应用正则表达式来获取最终字符串 1990January-20hello.abc
我以为我能做到:
String text = "1990January20hello.abc";
Pattern p = Patter.compile("(.*)(January|Jan)(.*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(text);
while (m.find()){
String val1 = m.group(2);
String val2 = val1.replace("$", "-");
text = text.replace(val1, val2);
}
当我这样做时,似乎在while循环中它确实找到“January”但是val2和text保持1月。我究竟做错了什么?就好像Java不能识别行尾/字符串的结尾。理想情况下,我想说 val1.replace(“(^ | $)”,“ - ”)所以我可以将 1990-January-20hello.abc 作为最终字符串。请帮忙。提前感谢您的建议。
答案 0 :(得分:0)
将此用于模式:
(\d+)([A-Za-z]+)(\d+)(.*)
结果组及其值为:
第1组= 1990年, 第2组= 1月, 第3组= 20, 第4组=字符串的其余部分。
然后你可以把它们加在一起并添加你想要的任何东西。
答案 1 :(得分:0)
String#replace
不使用正则表达式,因此不会匹配行字符的开头或结尾。您可以使用其中一种使用正则表达式的替换方法,例如replaceAll:
String text = "1990January20hello.abc";
Pattern p = Pattern.compile("(.*)(January|Jan)(.*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(text);
while (m.find()) {
String val1 = m.group(2);
String val2 = val1.replaceAll("$|^", "-");
text = text.replace(val1, val2);
}
输出:
1990-January-20hello.abc
答案 2 :(得分:0)
尝试
String s = "1990January20hello.abc";
String s2 = s.replaceAll("(Jan|January)(\\d+)", "$1-$2");
System.out.println(s2);
或使用Matcher
String s3 = Pattern
.compile("(Jan|January)(\\d+)", Pattern.CASE_INSENSITIVE)
.matcher(s).replaceAll("$1-$2");
System.out.println(s3);
答案 3 :(得分:0)
String无法识别所有正则表达式模式,这就是我的替换失败的原因。以下是我如何解决它:
String text = "1990January20hello.abc";
Pattern p = Patter.compile("(.*)(January|Jan)(.*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(text);
while (m.find()){
String val1 = m.group(2); //"January"
Pattern p1 = Pattern.compile(^|$);
Matcher m1 = p1.matcher(val1);
String val2 = m1.replaceAll("-"); //"-January-"
text = text.replace(val1, val2); //"1990-January-20hello.abc"
}
感谢您的反馈!