用于修改行或字符串开头和结尾的正则表达式

时间:2013-05-02 17:22:15

标签: java regex

鉴于此字符串 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 作为最终字符串。请帮忙。提前感谢您的建议。

4 个答案:

答案 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"
}

感谢您的反馈!