|
Java 库的建立方法及其实例(6) 接下来,看看Matcher类。这个类实现了MatchResult interface. 看看MatchResult的定义:
[games]$javap -classpath .. -s jregex.MatchResult
Compiled from jregex/MatchResult.java
public interface jregex.MatchResult
/* ACC_SUPER bit NOT set */
{
public static final int MATCH;
/* I */
public static final int PREFIX;
/* I */
public static final int SUFFIX;
/* I */
public static final int TARGET;
/* I */
public abstract jregex.Pattern pattern();
/* ()Ljregex/Pattern; */
public abstract int groupCount();
/* ()I */
public abstract boolean isCaptured();
/* ()Z */
public abstract boolean isCaptured(int);
/* (I)Z */
public abstract boolean isCaptured(java.lang.String);
/* (Ljava/lang/String;)Z */
public abstract java.lang.String group(int);
/* (I)Ljava/lang/String; */
public abstract boolean getGroup(int, java.lang.StringBuffer);
/* (ILjava/lang/StringBuffer;)Z */
public abstract boolean getGroup(int, jregex.TextBuffer);
/* (ILjregex/TextBuffer;)Z */
public abstract java.lang.String group(java.lang.String);
/* (Ljava/lang/String;)Ljava/lang/String; */
public abstract boolean getGroup(java.lang.String, java.lang.StringBuffer);
/* (Ljava/lang/String;Ljava/lang/StringBuffer;)Z */
public abstract boolean getGroup(java.lang.String, jregex.TextBuffer);
/* (Ljava/lang/String;Ljregex/TextBuffer;)Z */
public abstract java.lang.String prefix();
/* ()Ljava/lang/String; */
public abstract java.lang.String suffix();
/* ()Ljava/lang/String; */
public abstract java.lang.String target();
/* ()Ljava/lang/String; */
public abstract int targetStart();
/* ()I */
public abstract int targetEnd();
/* ()I */
public abstract char targetChars()[];
/* ()[C */
public abstract int start();
/* ()I */
public abstract int end();
/* ()I */
public abstract int length();
/* ()I */
public abstract int start(int);
/* (I)I */
public abstract int end(int);
/* (I)I */
public abstract int length(int);
/* (I)I */
public abstract char charAt(int);
/* (I)C */
public abstract char charAt(int, int);
/* (II)C */
}
jregex.MatchResult定义了一些abstract函数。有什么作用?在后面我们将会讨论到。
再看看Matcher的实现。
[games]$javap -classpath .. -s jregex.Matcher
Compiled from jregex/Matcher.java
public class jregex.Matcher extends java.lang.Object implements jregex.MatchResult {
public static final int ANCHOR_START;
/* I */
public static final int ANCHOR_LASTMATCH;
/* I */
public static final int ANCHOR_END;
/* I */
public static final int ACCEPT_INCOMPLETE;
/* I */
jregex.Matcher(jregex.Pattern);
/* (Ljregex/Pattern;)V */
public final void setTarget(jregex.Matcher, int);
/* (Ljregex/Matcher;I)V */
public void setTarget(java.lang.String);
/* (Ljava/lang/String;)V */
public void setTarget(java.lang.String, int, int);
/* (Ljava/lang/String;II)V */
public void setTarget(char[], int, int);
/* ([CII)V */
public final void setTarget(char[], int, int, boolean);
/* ([CIIZ)V */
public void setTarget(java.io.Reader, int) throws java.io.IOException;
/* (Ljava/io/Reader;I)V */
public final boolean isStart();
/* ()Z */
public final boolean matches();
/* ()Z */
public final boolean matches(java.lang.String);
/* (Ljava/lang/String;)Z */
public void setPosition(int);
/* (I)V */
public final boolean find();
/* ()Z */
public final boolean find(int);
/* (I)Z */
public jregex.MatchIterator findAll();
/* ()Ljregex/MatchIterator; */
public jregex.MatchIterator findAll(int);
/* (I)Ljregex/MatchIterator; */
public final boolean proceed();
/* ()Z */
public final boolean proceed(int);
/* (I)Z */
public final void skip();
/* ()V */
public java.lang.String toString();
/* ()Ljava/lang/String; */
public jregex.Pattern pattern();
/* ()Ljregex/Pattern; */
public java.lang.String target();
/* ()Ljava/lang/String; */
public char targetChars()[];
/* ()[C */
public int targetStart();
/* ()I */
public int targetEnd();
/* ()I */
public char charAt(int);
/* (I)C */
public char charAt(int, int);
/* (II)C */
public final int length();
/* ()I */
public final int start();
/* ()I */
public final int end();
/* ()I */
public java.lang.String prefix();
/* ()Ljava/lang/String; */
public java.lang.String suffix();
/* ()Ljava/lang/String; */
public int groupCount();
/* ()I */
public java.lang.String group(int);
/* (I)Ljava/lang/String; */
public java.lang.String group(java.lang.String);
/* (Ljava/lang/String;)Ljava/lang/String; */
public boolean getGroup(int, jregex.TextBuffer);
/* (ILjregex/TextBuffer;)Z */
public boolean getGroup(java.lang.String, jregex.TextBuffer);
/* (Ljava/lang/String;Ljregex/TextBuffer;)Z */
public boolean getGroup(int, java.lang.StringBuffer);
/* (ILjava/lang/StringBuffer;)Z */
public boolean getGroup(java.lang.String, java.lang.StringBuffer);
/* (Ljava/lang/String;Ljava/lang/StringBuffer;)Z */
public java.lang.String groups()[];
/* ()[Ljava/lang/String; */
public java.util.Vector groupv();
/* ()Ljava/util/Vector; */
public final boolean isCaptured();
/* ()Z */
public final boolean isCaptured(int);
/* (I)Z */
public final boolean isCaptured(java.lang.String);
/* (Ljava/lang/String;)Z */
public final int length(int);
/* (I)I */
public final int start(int);
/* (I)I */
public final int end(int);
/* (I)I */
public java.lang.String toString_d();
/* ()Ljava/lang/String; */
static {};
/* ()V */
先来看看它的构造函数,这个函数在Pattern中被调用用来构造Matcher类的实例。
Matcher(Pattern regex){
//注意下面这一行,它说明Matcher类的内部有一个指向Pattern实例的reference.
this.re=regex;
//int memregCount=(memregs=new MemReg[regex.memregs]).length;
//for(int i=0;i<memregCount;i++){
// this.memregs[i]=new MemReg(-1); //unlikely to SearchEntry, in this case we know memreg indicies by d
efinition
//}
//counters=new int[regex.counters];
//int lookaheadCount=(lookaheads=new LAEntry[regex.lookaheads]).length;
//for(int i=0;i<lookaheadCount;i++){
// this.lookaheads[i]=new LAEntry();
//}
//定义了一些内部的数据,MemReg是一个有三个整数的类。类的声明见下。
int memregCount,counterCount,lookaheadCount;
if((memregCount=regex.memregs)>0){
MemReg[] memregs=new MemReg[memregCount];
for(int i=0;i<memregCount;i++){
memregs[i]=new MemReg(-1); //unlikely to SearchEntry, in this case we know memreg indicies by defin
ition
}
this.memregs=memregs;
}
if((counterCount=regex.counters)>0) counters=new int[counterCount];
//定义了一些内部的数据。类的声明见下。
if((lookaheadCount=regex.lookaheads)>0){
LAEntry[] lookaheads=new LAEntry[lookaheadCount];
for(int i=0;i<lookaheadCount;i++){
lookaheads[i]=new LAEntry();
}
this.lookaheads=lookaheads;
}
this.memregCount=memregCount;
this.counterCount=counterCount;
this.lookaheadCount=lookaheadCount;
first=new SearchEntry(memregCount,counterCount);
defaultEntry=new SearchEntry(memregCount,counterCount);
minQueueLength=regex.stringRepr.length()/2; // evaluation!!!
}
把这两个类说明为default属性,说明这两个类在jregex这个包的内部可见,而在外部是不可见的。这 两个类的作用是专有的,而不是通用的。回忆一下本文前面提到过的,包的封装,"如果你不想让 类被外部的代码使用,可以用缺省的属性,去掉public."
class MemReg{
int index;
int in=-1,out=-1;
int tmp=-1; //for assuming at GROUP_IN
MemReg(int index){
this.index=index;
}
void reset(){
in=out=-1;
} }
class LAEntry{
int index;
SearchEntry top,actual;
}
另外,关于包的结构和包中的类的关系,我们感兴趣的还有,MatchIterator。
[games]$javap -classpath .. -s jregex.MatchIterator
Compiled from jregex/MatchIterator.java
public interface jregex.MatchIterator
/* ACC_SUPER bit NOT set */
{
public abstract boolean hasMore();
/* ()Z */
public abstract jregex.MatchResult nextMatch();
/* ()Ljregex/MatchResult; */
public abstract int count();
/* ()I */
}
这是一个interface, 定义了iterator的常用方法,列出所有的MatchResult的实例。 (未完待续)
|