Java正則表達式

本文主要講一下什么是正則表達式,正則表達式的一些常用語法,以及我們項目中用到的一些正則表達式.


定義

首先,正則表達式是一種強大而靈活的文本處理工具,使得我們能夠以編程的方式,構(gòu)造復(fù)雜的文本模式,對輸入的字符串進行搜索,一旦找到了匹配這些模式的分,你就能夠隨心所欲地對它們進行處理.因此,正則表達式提供的是一種完全通用的方式,能夠解決各種字符串處理相關(guān)問題:匹配憔维、選擇、編輯以及驗證.
注:正則表達式并不僅限于某一種語言业扒,但是在每種語言中有細微的差別。

語法

在其他語言中蹭沛,\ 表示:我想要在正則表達式中插入一個普通的(字面上的)反斜杠,請不要給它任何特殊的意義摊灭。
在 Java 中帚呼,\ 表示:我要插入一個正則表達式的反斜線,所以其后的字符具有特殊的意義煤杀。
所以,在其他的語言中酌儒,一個反斜杠\就足以具有轉(zhuǎn)義的作用枯途,而在正則表達式中則需要有兩個反斜杠才能被解析為其他語言中的轉(zhuǎn)義作用。也可以簡單的理解在正則表達式中呆躲,兩個 \ 代表其他語言中的一個 \捶索,這也就是為什么表示一位數(shù)字的正則表達式是 \d灰瞻,而表示一個普通的反斜杠是 \\。

普通字符

包括所有大寫和小寫字母酝润、所有數(shù)字要销、所有標點符號和一些其他符號。

非打印字符
特殊字符
限定符
邊界符

以上圖片來自菜鳥教程.
這些字符構(gòu)成了我們書寫正則表達式的要素.比如寫一個匹配六位數(shù)字的表達式為\d{6},可以根據(jù)自己的需求查閱表格,書寫自己的正則表達式.

String中的正則表達式

應(yīng)用正則表達式最簡單的途徑,就是使用String類的內(nèi)建功能.

matches()

檢查一個String是否匹配所給的正則表達式.
matches()
split()

split()方法的功能是"將字符串從正則表達式匹配的地方切開", 組裝到一個數(shù)組中去.
split()

第一個用的普通字符作為正則表達式,即使用空字符來劃分,第二個和第三個都用到了'//W' ,意思是非單詞字符(可以去上面找一下該字符的說明),它將標點刪掉了通過例子二可以看出來.第三個表示"字母e后面跟著一個或多個非單詞字符".可以看到,在原始字符串中,與正則表達式匹配的部分,在輸出的結(jié)果中都不存在了.
String.split()還有一個重載版本,它允許你限制字符串分割次數(shù).

replaceXXX()

String類自帶的最后一個正則表達式工具是"替換",可以只替換正則表達式第一個匹配的子串,或是替換所有匹配的地方.
replace()

第一個表達式要匹配的是以字母o開頭,后面跟一個或多個字母(這里是小寫的w),并且只替換掉第一個匹配的部分,"oh"被換成了"gogogo".
第二個是匹配兩個單詞中的任意一個,豎線表示或,并且替換所有匹配部分.

創(chuàng)建正則表達式

一般來說,比起功能有限的String類,我們更愿意構(gòu)造功能強大的正則表達式.因此我們需要用到j(luò)ava.util.regex 包中的三個類:
Pattern 類:
pattern 對象是一個正則表達式的編譯表示浑塞。Pattern 類沒有公共構(gòu)造方法。要創(chuàng)建一個 Pattern 對象掏愁,你必須首先調(diào)用其公共靜態(tài)編譯方法,它返回一個 Pattern 對象果港。該方法接受一個正則表達式作為它的第一個參數(shù)。
Matcher 類:
Matcher 對象是對輸入字符串進行解釋和匹配操作的引擎谢谦。與Pattern 類一樣公浪,Matcher 也沒有公共構(gòu)造方法。你需要調(diào)用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象厅各。
PatternSyntaxException:
PatternSyntaxException 是一個非強制異常類预柒,它表示一個正則表達式模式中的語法錯誤。


當(dāng)然Pattern和Matcher中還有很多的方法,譬如find(),start(),end(),reset()這里就不展開了,還會再寫一篇來具體介紹這些方法.


項目中用到的一些正則表達式

1.驗證手機號格式是否正確:
  /** 
  * 大陸手機號碼11位數(shù)憔古,匹配格式:前三位固定格式+后8位任意數(shù) 
  * 此方法中前三位格式有: 
  * 13+任意數(shù) 
  * 15+除4的任意數(shù) 
  * 18+除1和4的任意數(shù) 
  * 17+除9的任意數(shù) 
  * 147 
  */
  public static boolean isChinaPhoneLegal(String str) throws  PatternSyntaxException {  
        String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";  
        Pattern p = Pattern.compile(regExp);  
        Matcher m = p.matcher(str);  
        return m.matches();  
  }  

  /** 
   * 香港手機號碼8位數(shù)淋袖,5|6|8|9開頭+7位任意數(shù) 
   */  
  public static boolean isHKPhoneLegal(String str)throws PatternSyntaxException {  
      String regExp = "^(5|6|8|9)\\d{7}$";  
      Pattern p = Pattern.compile(regExp);  
      Matcher m = p.matcher(str);  
      return m.matches();  
  }  
2.驗證郵箱
  /** 
  * 是否是郵箱  
  * @param string 
  * @return 
  */
      public static boolean isEmail(String string) {
      Pattern p = Pattern
        .compile("^([a-z0-9A-Z]+[-|\\\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\\\.)+[a-zA-Z]{2,}$");
      Matcher m = p.matcher(string);
      return m.matches();
  }
3.在文字中匹配出六位數(shù)的股票代碼
  /** 
  * 匹配股票代碼(查到一個就停止)  
  * @param stirng 
  * @return 
  */
  public static String matchStocks(String stirng) {
String pStr = "(?<=\\D)([0123569]\\d{5})(?=\\D)|^([0123569]\\d{5})(?=\\D)|^([0123569]\\d{5})$|(?<=\\D)([0123569]\\d{5})$";
      Pattern pattern = Pattern.compile(pStr);
      Matcher matcher = pattern.matcher(stirng);
      String str = "";
      if (matcher.find()) {
          str = matcher.group(0);
      }
      return str;
  }

ps:參考書籍<<Thinking in Java>>.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末即碗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子内舟,更是在濱河造成了極大的恐慌初橘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耕蝉,死亡現(xiàn)場離奇詭異夜只,居然都是意外死亡,警方通過查閱死者的電腦和手機盐肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來推盛,“玉大人,你說我怎么就攤上這事榔昔”窬” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵诵肛,是天一觀的道長默穴。 經(jīng)常有香客問我,道長蓄诽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任乙埃,我火速辦了婚禮锯岖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚎莉。我一直安慰自己沛豌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布叫确。 她就那樣靜靜地躺著竹勉,像睡著了一般娄琉。 火紅的嫁衣襯著肌膚如雪吓歇。 梳的紋絲不亂的頭發(fā)上票腰,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音测柠,去河邊找鬼缘滥。 笑死,一個胖子當(dāng)著我的面吹牛朝扼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凹耙,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肠仪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了意述?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荤崇,失蹤者是張志新(化名)和其女友劉穎潮针,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓣戚,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡焦读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年矗晃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸵贬,死狀恐怖浑彰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郭变,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布周伦,位于F島的核電站未荒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏片排。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一迫卢、第九天 我趴在偏房一處隱蔽的房頂上張望冶共。 院中可真熱鬧,春花似錦捅僵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沛善,卻和暖如春航揉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背议薪。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斯议,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓坯临,卻偏偏與公主長得像恋昼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挟炬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Java的正則表達式講解:(為了能看清嗦哆,本文正則表達式用中文的句號代替英文句點) 英文句點符號:匹配單個任意字符。...
    紅姑娘閱讀 4,356評論 0 2
  • 1.正則表達式介紹 正則表達式算起來也是一個很龐大的語言系統(tǒng)粥喜,在所有的開發(fā)語言中基本都支持正則表達式烁峭,它可以很方便...
    babybus_superdo閱讀 2,570評論 3 6
  • 我是一只短腳的黃色小鳥 趁著清晨的陽光還未燥熱起來 我揮動著翅膀從波瀾的湖面飛過 瞧啊鬓梅,岸上的楊柳在清風(fēng)中微微擺動...
    Meet_半島閱讀 252評論 1 1
  • 社會上充斥著各種機會,各種生意绽快,各種誘惑,總有一夜暴富续担,各種速成班,就像隱藏在山底的武功秘籍一樣物遇,讓人趨之若鶩。然...
    感受背影閱讀 131評論 0 1
  • 一個沒控制询兴,又被他激怒了,對他一點都沒有耐心警儒,24小時的朝夕相處眶根,24小時蜀铲,除了了付出就是付出属百,他24小時隨時隨地...
    對與錯w閱讀 143評論 0 0