0

给定这个字符串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 循环中找到“一月”,但 val2 和文本停留在一月。我究竟做错了什么?就好像 Java 无法识别 $ 作为行尾/字符串的结尾。理想情况下,我想说val1.replace("(^|$)","-")这样我就可以得到1990-January-20hello.abc作为最终字符串。请帮忙。提前感谢您的建议。

4

4 回答 4

0

字符串无法识别所有正则表达式模式,这就是我的替换失败的原因。以下是我解决它的方法:

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

感谢您的反馈!

于 2013-05-03T13:02:01.037 回答
0

将此用于模式:

(\d+)([A-Za-z]+)(\d+)(.*)

结果组及其值是:

第 1 组 = 1990,第 2 组 = 一月,第 3 组 = 20,第 4 组 = 字符串的其余部分。

然后您可以将它们附加在一起并添加您想要的任何内容。

于 2013-05-02T17:26:33.127 回答
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
于 2013-05-02T17:33:13.740 回答
0

尝试

String s = "1990January20hello.abc";
String s2 = s.replaceAll("(Jan|January)(\\d+)", "$1-$2");
System.out.println(s2);

或使用匹配器

String s3 = Pattern
    .compile("(Jan|January)(\\d+)", Pattern.CASE_INSENSITIVE)
    .matcher(s).replaceAll("$1-$2");
System.out.println(s3);
于 2013-05-03T03:42:07.593 回答