亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何用Java編寫自己的庫(2)

2019-11-18 11:52:08
字體:
來源:轉載
供稿:網友

  下面,我們以一個具體的有實際用處的類庫來進一步討論庫的設計方法。這個庫是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來完成構造正則表達式的

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品美女视频明星a级| 性欧美xxxx交| 精品一区二区亚洲| 九九热这里只有精品免费看| 亚洲天堂成人在线| 伊人久久久久久久久久久久久| 97久久精品人人澡人人爽缅北| 成人av资源在线播放| 国产福利精品在线| 亚洲成人免费在线视频| 一区二区三区精品99久久| 久久国产精品影视| 奇米4444一区二区三区| 国产日本欧美一区二区三区| 精品亚洲一区二区三区四区五区| 尤物tv国产一区| 亚洲精品乱码久久久久久金桔影视| 韩国精品美女www爽爽爽视频| 日韩免费在线观看视频| 亚洲福利在线看| 色偷偷av一区二区三区| 亚洲视频在线观看网站| 亚洲理论在线a中文字幕| 色综合91久久精品中文字幕| 欧美日韩国产一区二区三区| 欧美专区在线视频| 久久综合久中文字幕青草| 一本色道久久88综合亚洲精品ⅰ| 精品国内亚洲在观看18黄| 久久天天躁狠狠躁夜夜躁2014| 国产午夜精品一区二区三区| 国产999精品久久久影片官网| 精品亚洲一区二区三区| 伦伦影院午夜日韩欧美限制| 最新国产成人av网站网址麻豆| 日韩精品视频免费专区在线播放| 免费97视频在线精品国自产拍| 国产欧美精品一区二区三区介绍| 亚洲免费小视频| 欧美日韩国产精品一区二区三区四区| 国产精品视频白浆免费视频| 日韩欧美a级成人黄色| 久久国内精品一国内精品| 亚洲欧洲日韩国产| 国产精品户外野外| 亚洲欧美中文另类| 色婷婷成人综合| 亚洲一区二区三区sesese| 亚洲精品www久久久久久广东| 亚洲天堂成人在线| 伊人久久男人天堂| 成人久久一区二区三区| 日韩av在线资源| 日韩视频在线免费观看| 6080yy精品一区二区三区| 69**夜色精品国产69乱| 国产日韩欧美中文| 日韩欧美一区二区在线| 亚洲精品99久久久久中文字幕| 这里只有精品视频| 最新国产精品拍自在线播放| 国产主播喷水一区二区| 91老司机精品视频| 亚洲影院色无极综合| 91中文精品字幕在线视频| 日韩中文字幕在线看| 欧美尺度大的性做爰视频| 日韩中文字幕在线看| 日韩欧美a级成人黄色| 亚洲成人av中文字幕| 97久久久免费福利网址| 丝袜一区二区三区| 日本精品中文字幕| 亚洲激情视频在线| 日韩欧美极品在线观看| 久久综合亚洲社区| 欧美老少配视频| 精品国产户外野外| 亚洲欧美综合另类中字| 亚洲人成电影网站色…| 91精品国产免费久久久久久| 中文欧美日本在线资源| 国产精品美女呻吟| 裸体女人亚洲精品一区| 国产精品色视频| 亚洲第一综合天堂另类专| 日本精品久久久久久久| 亚洲人高潮女人毛茸茸| 亚洲一区二区福利| 久久久久久这里只有精品| 久久人人看视频| 蜜月aⅴ免费一区二区三区| 日韩av免费看网站| 91tv亚洲精品香蕉国产一区7ujn| 欧美成人精品一区二区三区| 国产精品极品美女在线观看免费| 亚洲91av视频| 亚洲美腿欧美激情另类| 91精品久久久久久久久久另类| 色www亚洲国产张柏芝| 欧美色图在线视频| 欧美xxxx14xxxxx性爽| 国产亚洲激情视频在线| 96精品久久久久中文字幕| 色诱女教师一区二区三区| 日韩专区中文字幕| 青草热久免费精品视频| 亚洲欧洲第一视频| 欧洲日本亚洲国产区| 亚洲成**性毛茸茸| 91精品久久久久久久久青青| 久久97久久97精品免视看| 国产精品免费一区二区三区都可以| 欧美另类xxx| 日韩精品视频三区| 国产精品美女无圣光视频| 国产日韩精品在线播放| 在线播放日韩av| 色先锋久久影院av| 国产精品免费在线免费| 亚洲性无码av在线| 高清在线视频日韩欧美| 中文字幕亚洲综合| 国产黑人绿帽在线第一区| 精品高清美女精品国产区| 欧美激情第三页| 中文字幕亚洲综合| 欧美激情网友自拍| 欧美亚洲国产视频| www.国产一区| 日韩一区二区三区xxxx| 精品欧美aⅴ在线网站| 亚洲视频在线观看网站| 最近中文字幕mv在线一区二区三区四区| 2021国产精品视频| 亚洲自拍欧美色图| 一本一本久久a久久精品综合小说| 国产精品一区二区3区| 国产精自产拍久久久久久蜜| 亚洲免费高清视频| 久久久久久免费精品| 亚洲国产精品热久久| 成人欧美一区二区三区在线湿哒哒| 国产日韩欧美在线播放| 欧美精品精品精品精品免费| 尤物精品国产第一福利三区| 人九九综合九九宗合| 欧美视频在线观看 亚洲欧| 亚洲高清免费观看高清完整版| 在线电影av不卡网址| 欧美激情精品久久久久久免费印度| 久久综合国产精品台湾中文娱乐网| 国产视频精品自拍| 亚洲欧美成人在线| 亚洲第一页在线| 精品亚洲国产成av人片传媒| 欧美精品videossex88| 97视频免费观看| 大桥未久av一区二区三区| 国产日韩综合一区二区性色av| 日韩日本欧美亚洲| 亚洲精品v天堂中文字幕| 亚洲福利在线视频| 欧美激情综合色综合啪啪五月|