但是如果用如下代码测试则是NFApublic class Test{
public static void main(String[] args){
String message = "oneselfsufficient";
String regex = "(one|oneself)(self)?sufficient";
message = message.replaceAll(regex,"$1");
System.out.println(message);
}
}
//result:one有没比较熟悉Java正则的兄弟啊,麻烦告知下,谢谢了

解决方案 »

  1.   

    呵呵,不懂,上编译原理课看过一点NFA,DFA的东西
      

  2.   

    nfa吧
    正则只读一次,字符串多次读,吐
    所以默认时l*a
    会把
    lbbabbba当作匹配lbbabbba,而不是lbba
      

  3.   

    Java code
    public class Test{
        public static void main(String[] args){
            String message = "oneselfsufficient";
            String regex = "one((self)?(selfsufficient)?)";
            message = message.replaceAll(regex,"$1");
            System.out.println(message);
        }
    }
    //result:selfsufficient
    [/Quote]
    那为什么这里获得答案是选择较长的呢?
      

  4.   

    Java 的正则表达式引擎采用的是 NFA,所以相同功能不同的表达式在性能上是有差异的。
      

  5.   

    Java实现内部的确是把re编译成NFA。任何一个NFA都存在一个DFA和它等价,这一点你应该知道吧,
    我不明白的是你怎么用这个例子看出了它是DFA而不是NFA呢?