这个类是一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。
但是它的某些方法用起来并不是那么简单!也许只有上帝会用吧!真是应了那句话:
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的值为何为空?第二次执行它时,它不会读取第一行句子,而是忽略第一行,读取第二行,如果把第一行空出来,就可以解决这个可笑的问题了!??
盼望高手的出现,给我解决这个问题!
但是它的某些方法用起来并不是那么简单!也许只有上帝会用吧!真是应了那句话:
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的值为何为空?第二次执行它时,它不会读取第一行句子,而是忽略第一行,读取第二行,如果把第一行空出来,就可以解决这个可笑的问题了!??
盼望高手的出现,给我解决这个问题!
解决方案 »
- html简单问题
- scaledImg = (BufferedImage)tt.getScaledInstance(width, height,Image.SCALE_FAST); 返回值说不相配,这是怎么回事?
- 设计模式 备忘录模式 工厂模式是什么?
- 请教大家关于String的 hashCode() 问题?
- 串口堵塞问题,通讯采用com.sun.comm...,一台机大量发送数据,另一台机接收到一定时候,就回复出错?
- 如何加速成长为大型软件设计师和架构师?
- 按位与的简单问题(计算器和程序里结果不一样!)
- TOMCAT跑起;心情好来散点分;先来先得
- USENIX VM'04
- 关于内部匿名类
- 如果一个方法有返回类型,可以直接做为一个完整语句调用吗?
- 如何让JTable的一个单元格进入编辑状态
帖你的测试文件内容出来
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值??
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