package com.ricky.chapter5;public class Example4 {
public static void main(String[] args){
/*
 * 为什么方法一和方法二的结果不一样呢?
 */
method1();
method2();

}

public static void method1(){
String message = "c:/program files/java/src/ricky.java";
String regex = "([^//]*)$";
message = message.replaceAll(regex, "newFileName");
System.out.println(message);
}

public static void method2(){
String message = "c:/program files/java/src/ricky.java";
String regex = "([^//]+)$";
message = message.replaceAll(regex, "newFileName");
System.out.println(message);
}
}

解决方案 »

  1.   

    查阅Java API:Pattern
    Greedy 数量词 
    X?      X,一次或一次也没有 
    X*      X,零次或多次 
    X+      X,一次或多次 
    X{n}    X,恰好 n 次 
    X{n,}   X,至少 n 次 
    X{n,m}  X,至少 n 次,但是不超过 m 次 
      

  2.   

    刚运行了LZ的程序:
    输出结果为:
    c:/program files/java/src/newFileNamenewFileName
    c:/program files/java/src/newFileName
    初时,也感到奇怪,怎么1后面有2个newFileName.为了分析方便,我把message后面加了'/',
    即:String message = "c:/program files/java/src/ricky.java/";
    输出结果为:
    c:/program files/java/src/ricky.java/newFileName
    c:/program files/java/src/ricky.java/因为,String regex = "([^//]*)$";
    分解含义为:(  ([^//]+)$) | ($) )
      

  3.   

    这我知道,那么为什么是两个newFileName呢?按照NFA来说虽然会走原路,但是不可能两个选择都来吧
      

  4.   

    因为,String regex = "([^//]*)$"; 
    分解含义为:(  ([^//]+)$) | ($) ) ??
    4楼的兄弟,那么为什么会出现后面有两个呢?