国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

徹底研究 Java 中的正則表達式

2019-11-18 13:17:59
字體:
來源:轉載
供稿:網友

  /*以下是我最近研究正則表達式的成果希望能對大家有幫助。其中也有我碰到的不明白之處,各位有精通的請發mail給我講講。還有有誰對javascript的正則表達式精通請給大家發一下吧。這些東東都是Javadoc上有的,還有一些是我在java.sun.com/docs/books/tutorial/extra/regex/index.Html上看到的,我建議對正則表達式感愛好的不妨上去看看,很不錯。
  */
  package testreg;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  /**
  * <p>Title: 正則表達式的研究</p>
  * <p>Description:
  * 最近在工作中經常用到一些正則表達式的使用問題,到網上去找介紹大多是一鱗半爪。求人不如求已。一狠心,自己看!這兩天利用我們項目兩期之間的一點空閑對J2SE所支持的正則表達式來了個徹底研究!代價是……就是浪廢了部門近十二張白紙。閑話少說,書歸正傳。
  * 原理:
  *   正則表達式的原理是有限狀態自動機,自動機內部有有限個狀態,有一個初始狀態,有一個結束狀態。自動機根據輸入和自身內部的當前狀態來決定下一步于什么。呵呵,這是很久以前學的東東了也記不清了,大家只作參照吧。
  * Java中的正則表達式:
  *   從J2SE1.4起Java增加了對正則表達式的支持就是java.util.regex包,這個包中主要有3個類:Pattern,代表模式,就是正則表達式自身,Matcher,是一個有限狀態自動機,其實大多數的活還是讓Pattern類于了,Matcher往往只是簡單的調用Pattern,不知道這是什么模式。這兩個類寫的都很經典,還有不少算法在內值得有功力的人仔細研究一下。另一個是一個異常類當所用正則表達式不正確時拋出,是運行時異常。
  * 幾個難點:
  *  1.line terminator
  *   line terminator 中文意終結符,是指一個或兩個字符組成的字符序列。java中的
  *   所有line terminator:
  *   A newline (line feed) character ('/n'),
  *   -----------換行符(0A)
  *   A carriage-return character followed immediately by a newline character ("/r/n"),
  *   -----------回車+換行(0D0A)
  *   A standalone carriage-return character ('/r'),
  *   -----------回車(0D)
  *   A next-line character ('/u0085'),
  *   ------------下一行符?(?表示我也不知道是什么,請大家明白的給我發mail
  *   A line-separator character ('/u2028'), or
  *   ------------行分隔符?
  *   A paragraph-separator character ('/u2029).
  *   ------------段落分隔符?
  *   If UNIX_LINES mode is activated, then the only line terminators recognized are newline characters.
  *   假如使用unix模式則只有/n被認為是line terminator,也就是在使用pattern時如下:
  *   Pattern p=Pattern.compile("正則表達式",Pattern.UNIX_LINE);
  *   或 Pattern p=Pattern.compile("(?d)正則表達式")
  *   "."匹配除line terminator以外的所有字符(未指定DOTALL時)
  *   在指定DOTAll模式時"."匹配所有字符
  *  2.Quantifiers,Greedy,RelUCtant and Possessive.
  *   這幾個詞不太好譯,原文是Greedy Quantifiers,Reluctant Quantifiers and Possessive Quantifiers憑我這點英語我只好譯作貪婪的量子,不情愿的量子和占有欲強的量子?這也太搞笑了好在我理解了他們的意思。這點等下我細說。
  *  3. 對于[a-zA-Z],[a-d[h-i]],[^a-f],[b-f&&[a-z]],[b-f&&[^cd]]等形式的理解對于上述,原文用range,union,negation,intersection,suBTraction等來描述range表是范圍,union是并集,negation是取反,intersection是交集,subtraction是……是減法??反正是減去一部分的意思
  *   range    a-z 從a到z的小寫字母
  *   negation  [^a-f]除了a-f之外所有的,全集是所有字符
  *   union    [a-d[h-i]] a-d并h-i
  *   subtraction [b-f&&[^cd]] 就是b-f中除了cd以外的都是
  *   intersection[b-f&&[a-z]] 就是b-f與a-z中的公共部分
  *   我總結了一下,其實就是方括號表示一個集合,集合中的元素用列舉法表示如[abcd],但太多了怎么為?總不能把從a到z的全列舉吧?那就用a-z表示且省略了方括號,交集用&&表示,并集省略,差集(對subtraction譯成差集還差不多)用交集和取反來表示。所以,以上的可表示為:
  *   [[a-z][A-Z]],[[a-d][h-i]],[^a-f],[[b-f]&&[a-z]],[[b-f]&&[^cd]]
  *   這樣是不是和我們的習慣相符了.
  *  4.各個標志的意義
  *   在生成pattern時可以同時使用幾個標志來指定進行匹配時的方案。
  *   用法形如:Pattern p=Pattern.compile(".*a?",Pattern.UNIX_LINES);
  *   當同時指定多個標志時可以使用""操作符連接如:
  *   Pattern p=Pattern.compile(".*a?,Pattern.UNIX_LINESPattern.DOTALL);
  *   也可以在表達式中指定如:
  *   Pattern p=Pattern.compile("(?d).*a?");
  *   Pattern p=Pattern.compile("(?d)(?s).*a?");
  *   以上兩個定義和前面兩個對應等價
  *   所有的標志如下:
  *   Constant        Equivalent Embedded Flag EXPRession
  Pattern.CANON_EQ       None Enables canonical equivalence
  Pattern.CASE_INSENSITIVE   (?i) Enables case-insensitive matching
  Pattern.COMMENTS       (?x) Permits whitespace and comments in pattern.
  Pattern.MULTILINE       (?m) Enables multiline mode.
  Pattern.DOATALL        (?s) Enables dotall mode
  Pattern.UNICODE_CASE     (?u) Enables Unicode-aware case folding.
  Pattern.UNIX_LINES      (?d) Enables Unix lines mode
  
  CANON_EQ 指定使用規范等價模式?這個我理解的也有限,是不是說只要指定了這個模式則ascii碼的'a'就可以和unicode的'a'還有XXX碼的'a'相等?請教各位。(mail to me)
  
  CASE_INSENSITIVE 指定使用大小寫不敏感的匹配模式,這個好理解,但要注重這個標志只是對ascii碼有效,要使unicode在比較時也忽略大小寫要同時指定UNICODE_CASE,就是要指定CASE_INSENSITIVEUNICODE_CASE或使用(?i)(?u)
  
  COMMENTS 指定使用注釋和忽略空白,也就是".*a"==". *a #this is comments"我想這個在正則表達式很大,而且是在文件中輸入時比較有用,平時我看也用不上。
  
  MULTILINE In multiline mode the expressions ^ and $ match just after
  or just before, respectively, a line terminator or the end of the
  input sequence. By default these expressions only match at the beginning
  and the end of the entire input sequence
  指定使用多行匹配模式,在默認模式下,^和$分別只匹配一個輸入的開始和結束。
  在這種模式下,^和$ 除了匹配整個輸入的開始和結束外還匹配一個line terminator的后邊和前邊(不是前邊和后邊,就是說^匹配line terminator的后邊$匹配line terminator的前邊。
  
  DOATALL 如指定了這個模式則"."可匹配任何字符包括line terminator UNIX_LINES 指定這個模式時只有/n被認為是line terminator而/r和/r/n都不是其他的我一時想不起來了,在具體介紹時再說吧。
  </p>
  /
  public class TestReg2
  {
  
  public static void main(String[] args)
  {
  String str1 = "";
  Object str = "";
  //注重:/r,/n,/b等轉義字符在java字符串常量中要寫成//r,//n,//b等,否則編譯都過不去
  ///s匹配/r,/n,/r和空格
  System.out.println("http://s匹配//r,//n,//r和空格 "+" /t/n/r".matches("http://s{4}"));
  ///S和/s互逆
  System.out.println("http://S和//s互逆 "+"/".matches("http://S"));
  //.不匹配/r和/n
  System.out.println(".不匹配//r和//n "+"/r".matches("."));
  System.out.println("/n".matches("."));
  
  ///w匹配字母,數字和下劃線
  System.out.println("http://w匹配字母,數字和下劃線 "+"a8_".matches("http://w//w//w"));
  ///W和/w互逆
  System.out.println("http://W和//w互逆 "+"&_".matches("http://W//w"));
  ///d匹配數字
  System.out.println("http://d匹配數字 "+"8".matches("http://d"));
  ///D與/d互逆
  System.out.println("http://D與//d互逆"+"%".matches("http://D"));
  //兩者都匹配但意文不同
  System.out.println("======================");
  System.out.println("表示//000a匹配//000a "+"/n".matches("/n"));
  System.out.println("表示//n匹配換行 "+"/n".matches("http://n"));
  System.out.println("======================");
  //兩者都匹配但意文不同
  System.out.println("/r".matches("/r"));
  System.out.println("/r".matches("http://r"));
  System.out.println("======================");
  //^匹配開頭
  System.out.println("^匹配開頭"+"hell".matches("^hell"));
  System.out.println("abc/nhell".matches("^hell"));
  //$匹配結束
  System.out.println("$匹配結束"+"my car/nabc".matches(".*ar$"));
  System.out.println("my car".matches(".*ar$"));

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽江市| 雅安市| 邛崃市| 高阳县| 东乌珠穆沁旗| 平谷区| 龙游县| 景谷| 松溪县| 凉城县| 宝丰县| 比如县| 莱芜市| 淮南市| 盖州市| 香河县| 湟源县| 韶山市| 潢川县| 康马县| 乌兰察布市| 万荣县| 高要市| 奉贤区| 青神县| 通河县| 仲巴县| 阜平县| 宁海县| 富川| 中卫市| 抚远县| 宁安市| 汾阳市| 张家口市| 邹城市| 保德县| 赞皇县| 苏州市| 姜堰市| 泊头市|