分享
 
 
 

如何用Java编写自己的库(2)

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

下面,我们以一个具体的有实际用处的类库来进一步讨论库的设计方法。这个库是jregex. (jregex.sourceforge.net)。这是一个用Java实现的兼容Perl 5.6的正则表达式的库。有很多这样的库, 比如gnu.regexp,com.stevesoft.pat, 还有J2SE SDK 1.4中新增加的regex.为什么选用jregex呢?是因为 它是目前源代码公开的regex库中兼容Perl 5.6的正则表达式,而且刚刚更新过源代码,并且是稳定 版,另外一个就是,它的内核算法选用了NFA(Not Finite Automata)。

要了解一个包,在看源代码之前先应该看的就是它的API文档。那么,看文档的第一步应该看什么呢?当然是树形结构。

Class Hierarchy

class java.lang.Object

class jregex.Matcher (implements jregex.MatchResult)

class jregex.Optimizer

class jregex.util.io.PathPattern

class jregex.Pattern (implements jregex.REFlags, java.io.Serializable)

class jregex.PerlSubstitution (implements jregex.Substitution)

class jregex.Replacer

class jregex.RETokenizer (implements java.util.Enumeration)

class java.lang.Throwable (implements java.io.Serializable)

class java.lang.Exception

class java.lang.RuntimeException

class java.lang.IllegalArgumentException

class jregex.PatternSyntaxException

class jregex.util.io.WildcardFilter (implements java.io.FilenameFilter)

Interface Hierarchy

interface jregex.MatchIterator

interface jregex.MatchResult

interface jregex.REFlags

interface jregex.Substitution

interface jregex.TextBuffer

interface jregex.Replacer.WriterWrap

在一个正则表达式中,我们知道有两个元素很重要,第一个就是Pattern(模式), 第二个是Matcher(匹 配结果字符串)。在jregex中,Pattern类实现了jregex.REFlags interface,和java.io.Serializable。先来看看jregex.REFlags的说明。jregex.REFlags定义了一些静态的常量,看起来是一些标志。Pattern实现了 jregex.REFlags, 也就是说,Pattern类中包含了这些静态的常量。

下一步,我们看看Pattern的API说明:

Pattern是一个预编译好的正则表达式的表示。要匹配一个正则表达式,先创建一个Pattern实例:

Pattern p=new Pattern(myExpr);

然后取得Matcher的实例

Matcher matcher=p.matcher(myText);

Matcher的实例是一个自动的匹配和搜索的对象。它提供如下方法:

搜索匹配结果: matcher.find() or matcher.findAll();

监测是否全文匹配 : matcher.matches();

监测是否匹配开头 : matcher.isStart();

带选项的查找 : matcher.find(int options)

标志

标志(参考REFlags)改变了在预编译的时候正则表达式符号的意义。这些标志是:

REFlags.IGNORE_CASE - 忽略大小

REFlags.MULTILINE - 用^和$来表示一行文本的开头和结尾

REFlags.DOTALL - 用.来表示回车换行

REFlags.IGNORE_SPACES - 忽略空

REFlags.UNICODE - 使用UNICODE, 即w, d不再被解释为正则表达式的意义,而是被解释为 UNICODE.

REFlags.XML_SCHEMA - 使用XML语义。

线程

Pattern是线程安全的。也就是说,你可以在不同的线程中使用同一个Pattern的实例。

在API函数说明中,我们还能看到Pattern类的public方法。这一点将在下面有用处。先来看看构造函数:

Pattern(java.lang.String regex)

Compiles an expression with default flags.

Pattern(java.lang.String regex, int flags)

Compiles a regular expression using REFlags.

Pattern(java.lang.String regex, java.lang.String flags)

Compiles a regular expression using Perl5-style flags.

方法

int groupCount()

How many capturing groups this expression includes?

java.lang.Integer groupId(java.lang.String name)

Get numeric id for a group name.

Matcher matcher()

Returns a targetless matcher.

Matcher matcher(char[] data, int start, int end)

Returns a matcher for a specified region.

Matcher matcher(MatchResult res, int groupId)

Returns a matcher for a match result (in a performance-friendly way).

Matcher matcher(MatchResult res, java.lang.String groupName)

Just as above, yet with symbolic group name.

Matcher matcher(java.io.Reader text, int length)

Returns a matcher taking a text stream as target.

Matcher matcher(java.lang.String s)

Returns a matcher for a specified string.

Replacer replacer(java.lang.String expr)

Returns a replacer of a pattern by specified perl-like expression.

Replacer replacer(Substitution model)

Returns a replacer will substitute all occurences of a pattern through applying a user-defined substitution model.

RETokenizer tokenizer(char[] data, int off, int len)

Tokenizes a specified region by an occurences of the pattern.

RETokenizer tokenizer(java.io.Reader in, int length)

Tokenizes a specified region by an occurences of the pattern.

RETokenizer tokenizer(java.lang.String text)

Tokenizes a text by an occurences of the pattern.

java.lang.String toString_d()

Returns a less or more readable representation of a bytecode for the pattern.

java.lang.String toString()

接下来,我们来看看Pattern类的内容。这里有两种方法,一种是直接阅读源代码,另外一种是先用工具分析一下Pattern类的内容。这里,我采用第二种方法,用javap来看类的内容。

[games]$javap -classpath .. -private jregex.Pattern

Compiled from jregex/Pattern.java

public class jregex.Pattern extends java.lang.Object implements java.io.Serializable, jregex.REFlags {

java.lang.String stringRepr;

jregex.Term root;

jregex.Term root0;

int memregs;

int counters;

int lookaheads;

java.util.Hashtable namedGroupMap;

private jregex.Pattern() throws jregex.PatternSyntaxException;

public jregex.Pattern(java.lang.String) throws jregex.PatternSyntaxException;

public jregex.Pattern(java.lang.String,java.lang.String) throws

jregex.PatternSyntaxException;

public jregex.Pattern(java.lang.String,int) throws jregex.PatternSyntaxException;

private void compile(java.lang.String, int) throws jregex.PatternSyntaxException;

public int groupCount();

public java.lang.Integer groupId(java.lang.String);

public jregex.Matcher matcher();

public jregex.Matcher matcher(java.lang.String);

public jregex.Matcher matcher(char[], int, int);

public jregex.Matcher matcher(jregex.MatchResult, int);

public jregex.Matcher matcher(jregex.MatchResult, java.lang.String);

public jregex.Matcher matcher(java.io.Reader, int) throws java.io.IOException;

public jregex.Replacer replacer(java.lang.String);

public jregex.Replacer replacer(jregex.Substitution);

public jregex.RETokenizer tokenizer(java.lang.String);

public jregex.RETokenizer tokenizer(char[], int, int);

public jregex.RETokenizer tokenizer(java.io.Reader, int) throws java.io.IOException;

public java.lang.String toString();

public java.lang.String toString_d();

static int parseFlags(java.lang.String) throws jregex.PatternSyntaxException;

static int parseFlags(char[], int, int) throws jregex.PatternSyntaxException;

private static int getFlag(char) throws jregex.PatternSyntaxException;

}

其中,要关心private和protected成员,因为在使用类的时候,我们只要关心public成员就行了,但 是,要阅读源代码,明白类的构成,就必须注意private和protected成员。

private Pattern() throws PatternSyntaxException{}

public Pattern(String regex) throws PatternSyntaxException{

this(regex,DEFAULT);

}

public Pattern(String regex,String flags) throws PatternSyntaxException{

stringRepr=regex;

compile(regex,parseFlags(flags));

}

public Pattern(String regex, int flags) throws PatternSyntaxException{

stringRepr=regex;

compile(regex,flags);

}

可以看出,构造函数中,有一个缺省的构造函数是private。而第二个调用了最后一个构造函数,用 this()。第三个和最后一个都是用了一个函数compile来完成构造正则表达式的

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有