这个类是一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。
但是它的某些方法用起来并不是那么简单!也许只有上帝会用吧!真是应了那句话:
SUN的理论天下无敌,但是上帝知道它能搞出来什么东东!
   有个问题希望除了上帝之外,还是有人可以解决的!
Scanner类中的findInLine(Pattern/String)方法 在下面这段小程序中产生令人费解的结果:
  public static void readFile(String fileName){
    File file=new File(fileName);
    try{
Scanner s=new Scanner(new FileInputStream(fileName));
String exp="^IF\\s*";
Pattern pat=Pattern.compile(exp,Pattern.MULTILINE);
while(s.hasNextLine()){
  String line=s.findInLine(pat);
  if(line!=null){
    System.out.println("right");

     }
else{
   System.out.println("errorr");
   }
          s.nextLine();                   }
s.close();
  }catch(IOException e){
    e.printStackTrace();
    }

}Scanner的findInLine()这个方法,直接用于一个句子是没有任何问题的:
像:String text="Thank your for the replay ";
   Scanner s=new Scanner(text);
   s.findInLine("^Thank\\s*");
但是当用它读取文件时,所产生的结果令人百思不得其解!!
问题如下:第一次执行到 String line=s.findInLine(pat);这句时,line的值为何为空?第二次执行它时,它不会读取第一行句子,而是忽略第一行,读取第二行,如果把第一行空出来,就可以解决这个可笑的问题了!??
  盼望高手的出现,给我解决这个问题!

解决方案 »

  1.   

    如果找不到匹配的就返回null,
    帖你的测试文件内容出来
      

  2.   

    IF 该动物有毛发   THEN  该动物是哺乳动物
    IF 该动物有奶     THEN  该动物是哺乳动物
    IF 该动物有羽毛   THEN  该动物是鸟
    IF 该动物会飞     AND   会下蛋   THEN   该动物是鸟
    IF 该项动物会吃肉 THEN  该动物是食肉动物
    IF 该动物有犬齿   AND   有爪   AND   眼盯前方    THEN    该动物是食肉动物
    IF 该动物是哺乳动物 AND 有蹄   THEN  该动物是有蹄类动物
    IF 该动物是哺乳动物 AND 是嚼反刍动物 THEN   该动物是有蹄类动物
    IF 该动物是哺乳动物 AND是食肉动物 AND 是黄褐色 AND身上有暗斑点 THEN 该动物是金钱豹
    IF 该动物是哺乳动物 AND是食肉动物 AND 是黄褐色 AND身上有黑色条纹 THEN 该动物是虎
    IF 该动物是有蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是长颈鹿
    IF 该动物是有蹄类动物 AND 身上有黑色条纹 THEN 该动物是斑马
    IF 该动物是鸟 AND 有长脖子 AND 有长腿 AND 不会飞 AND 有黑白二色 THEN 该动物是鸵鸟
    IF 该动物是鸟 AND 会游泳 AND 不会飞 AND 有黑白二色 THEN 该动物是企鹅
    IF 该动物是鸟 AND 善飞 THEN 该动物是信天翁
     上面是文件内容,问题的关键是它够匹配的,第一次执行到 String line=s.findInLine(pat);这句时,line的值为何为空??但是第二次它就可以匹配了,难道第一次没有实际赋于line值??
      

  3.   

    测试了一下,全部输出right,jdk1.5.0_10
      

  4.   

    有点莫名其妙竟然可以了?能不能帮我看看下面这个为什么不行?
    import java.util.*;
    import java.util.regex.*;
    import java.io.*;public class ScannerTest5{
    static final int CELLS=4;
    public static void readFile(String fileName){
    try{
    File file=new File(fileName);
    Scanner s=new Scanner(file);
    List<String[]> vals=new ArrayList<String[]>();
    String exp="^(.*),(.*),(.*),(.*)";
    Pattern pat=Pattern.compile(exp,Pattern.MULTILINE);
    while(s.hasNextLine()){
    String line=s.findInLine(pat);
    if(line!=null){
    String[] cells=new String[CELLS];
    MatchResult match=s.match();
    for(int i=0;i<CELLS;i++)
      cells[i]=match.group(i+1);
    vals.add(cells);
    s.nextLine();
    }
    else
      System.out.println("error");
    }
      for(String[] str:vals){
        for(String ss:str)
       System.out.print(ss);
      System.out.println(""); 
      }
    }catch(IOException e){
    System.out.println("e");
    }
    }
    public static void main(String[] args){
    if(args.length<1)
       System.exit(0);
    try{
    readFile(args[0]); }catch(NoSuchElementException e){
    e.printStackTrace();
    }}
    }下面是测试文件的内容:
    1,2,3,4
    5,6,7,8
    ab,cd,ef,gh
    em,wa,ha,bbb
    in,im,sa,bb
    aan,ii,
    bbe,bb,ee,
    wi,ai,bb,ee,uu,ii
    i,v,k,j
    i,s,ja,iw,ij,ji