正則表達式小結

1.1 什麼是正則表達式java

     正則表達式是一種特殊的字符串模式,用於匹配一組字符串,就比如用模具作產品,而正則就是這個模具,定義一種規則去匹配符合規則的字符。正則表達式

規則app

在線匹配工具:工具

  1 http://www.regexpal.com/ regexp

      2 http://rubular.com/ 內存

     正則匹配軟件資源

      McTracer 文檔

      用過幾個以後仍是以爲這個是最好用的,支持將正則導成對應的語言如java C# js等還幫你轉義了,Copy直接用就好了很方便,另外支持把正則表達式用法解釋,如哪一段是捕獲分組,哪段是貪婪匹配等等,總之用起來 So Happy .字符串

   "^" :^會匹配行或者字符串的起始位置,有時還會匹配整個文檔的起始位置。 get

   "$"  :$會匹配行或字符串的結尾

 "\b" :不會消耗任何字符只匹配一個位置,經常使用於匹配單詞邊界 如 我想從字符串中"This is Regex"匹配單獨的單詞 "is" 正則就要寫成 "\bis\b"  

    \b 不會匹配is 兩邊的字符,但它會識別is 兩邊是否爲單詞的邊界 

 "\d": 匹配數字,

    例如要匹配一個固定格式的電話號碼以0開頭前4位後7位,如0737-5686123  正則:^0\d\d\d-\d\d\d\d\d\d\d$ 這裏只是爲了介紹"\d"字符,實際上有更好的寫法會在     下面介紹。

 "\w":匹配字母,數字,下劃線.

    例如我要匹配"a2345BCD__TTz" 正則:"\w+"  這裏的"+"字符爲一個量詞指重複的次數,稍後會詳細介紹。

  ".":匹配除了換行符之外的任何字符

    這個算是"\w"的增強版了"\w"不能匹配 空格 若是把字符串加上空格用"\w"就受限了,看下用 "."是如何匹配字符"a23 4 5 B C D__TTz"  正則:".+"

  "[abc]": 字符組  匹配包含括號內元素的字符 

        這個比較簡單了只匹配括號內存在的字符,還能夠寫成[a-z]匹配a至z的因此字母就等於能夠用來控制只能輸入英文了,

2.2 幾種反義

  寫法很簡單改爲大寫就好了,意思與原來的相反,這裏就不舉例子了

   "\W"   匹配任意不是字母,數字,下劃線 的字符

   "\S"   匹配任意不是空白符的字符

 "\D"  匹配任意非數字的字符

   "\B"  匹配不是單詞開頭或結束的位置

   "[^abc]"  匹配除了abc之外的任意字符

 2.3  量詞

  先解釋關於量詞所涉及到的重要的三個概念

    貪婪(貪心) 如"*"字符 貪婪量詞會首先匹配整個字符串,嘗試匹配時,它會選定儘量多的內容,若是 失敗則回退一個字符,而後再次嘗試回退的過程就叫作回溯,它會每次回退一個字符,直到找到匹配的內容或者沒有字符能夠回退。相比下面兩種貪婪量詞對資源的消耗是最大的,

   懶惰(勉強) 如 "?"  懶惰量詞使用另外一種方式匹配,它從目標的起始位置開始嘗試匹配,每次檢查一個字符,並尋找它要匹配的內容,如此循環直到字符結尾處。

   佔有  如"+" 佔有量詞會覆蓋事個目標字符串,而後嘗試尋找匹配內容 ,但它只嘗試一次,不會回溯,就比如先抓一把石頭,而後從石頭中挑出黃金

     "*"(貪婪)   重複零次或更多

     例如"aaaaaaaa" 匹配字符串中全部的a  正則: "a*"   會出到全部的字符"a"

     "+"(懶惰)   重複一次或更屢次

       例如"aaaaaaaa" 匹配字符串中全部的a  正則: "a+"  會取到字符中全部的a字符,  "a+"與"a*"不一樣在於"+"至少是一次而"*" 能夠是0次,

       稍後會與"?"字符結合來體現這種區別

     "?"(佔有)   重複零次或一次

       例如"aaaaaaaa" 匹配字符串中的a 正則 : "a?" 只會匹配一次,也就是結果只是單個字符a

   "{n}"  重複n次

       例如從"aaaaaaaa" 匹配字符串的a 並重復3次 正則:  "a{3}"  結果就是取到3個a字符  "aaa";

   "{n,m}"  重複n到m次

       例如正則 "a{3,4}" 將a重複匹配3次或者4次 因此供匹配的字符能夠是三個"aaa"也能夠是四個"aaaa" 正則均可以匹配到

     "{n,}"  重複n次或更屢次

       與{n,m}不一樣之處就在於匹配的次數將沒有上限,但至少要重複n次 如 正則"a{3,}" a至少要重複3次

 把量詞瞭解了以後以前匹配電話號碼的正則如今就能夠改得簡單點了^0\d\d\d-\d\d\d\d\d\d\d$ 能夠改成"^0\d+-\d{7}$"。

這樣寫還不夠完美若是由於前面的區號沒有作限定,以致於能夠輸入不少們,而一般只能是3位或者4位,

如今再改一下 "^0\d{2,3}-\d{7}"如此一來區號部分就能夠匹配3位或者4位的了

 2.4 懶惰限定符

  "*?"   重複任意次,但儘量少重複 

      如 "acbacb"  正則  "a.*?b" 只會取到第一個"acb" 本來能夠所有取到但加了限定符後,只會匹配儘量少的字符 ,而"acbacb"最少字符的結果就是"acb" 

  "+?"  重複1次或更屢次,但儘量少重複

     與上面同樣,只是至少要重複1次

  "??"  重複0次或1次,但儘量少重複

      如 "aaacb" 正則 "a.??b" 只會取到最後的三個字符"acb"

  "{n,m}?"  重複n到m次,但儘量少重複

          如 "aaaaaaaa"  正則 "a{0,m}" 由於最少是0次因此取到結果爲空

  "{n,}?"    重複n次以上,但儘量少重複

          如 "aaaaaaa"  正則 "a{1,}" 最少是1次因此取到結果爲 "a"

3.1 捕獲分組

  先了解在正則中捕獲分組的概念,其實就是一個括號內的內容 如 "(\d)\d" 而"(\d)" 這就是一個捕獲分組,能夠對捕獲分組進行 後向引用 (若是後而有相同的內容則能夠直接引用前面定義的捕獲組,以簡化表達式) 如(\d)\d\1 這裏的"\1"就是對"(\d)"的後向引用

那捕獲分組有什麼用呢看個例子就知道了

如  "zery zery" 正則 \b(\w+)\b\s\1\b 因此這裏的"\1"所捕獲到的字符也是 與(\w+)同樣的"zery",爲了讓組名更有意義,組名是能夠自定義名字的

"\b(?<name>\w+)\b\s\k<name>\b" 用"?<name>"就能夠自定義組名了而要後向引用組時要記得寫成 "\k<name>";自定義組名後,捕獲組中匹配到的值就會保存在定義的組名裏

下面列出捕獲分組常有的用法

 

"(exp)"    匹配exp,並捕獲文本到自動命名的組裏

"(?<name>exp)"   匹配exp,並捕獲文本到名稱爲name的組裏

"(?:exp)"  匹配exp,不捕獲匹配的文本,也不給此分組分配組號

如下爲零寬斷言

"(?=exp)"  匹配exp前面的位置

  如 "How are you doing" 正則"(?<txt>.+(?=ing))" 這裏取ing前全部的字符,並定義了一個捕獲分組名字爲 "txt" 而"txt"這個組裏的值爲"How are you do";

"(?<=exp)"  匹配exp後面的位置

  如 "How are you doing" 正則"(?<txt>(?<=How).+)" 這裏取"How"以後全部的字符,並定義了一個捕獲分組名字爲 "txt" 而"txt"這個組裏的值爲" are you doing";

"(?!exp)"  匹配後面跟的不是exp的位置

  如 "123abc" 正則 "\d{3}(?!\d)"匹配3位數字後非數字的結果

"(?<!exp)"  匹配前面不是exp的位置

  如 "abc123 " 正則 "(?<![0-9])123" 匹配"123"前面是非數字的結果也可寫成"(?!<\d)123"

相關文章
相關標籤/搜索