正則表達式

簡單的學習一下正則表達式吧

  1. 最簡單的,比如匹配matrix
    • 這樣會匹配到所有含有matrix的,比如,matrix67,matrix123等
  2. \b metacharacter
    • 匹配一個位置,代表開頭或者結尾
    • 比如,\bmatrix\b 就是匹配單詞matrix了
  3. . 匹配除了換行符外所有的元素
  4. * 閉包
    • 比如.* 就是匹配所有不包含換行的字符串
  5. + 正閉包
    • 比如.+ 就是匹配所有不包含換行的字符串,但必須有一位,不能爲空
  6. ? 匹配0次或1次
  7. \d 匹配一個數字的字符(0,1,2…,9)
    • 0\d\d-\d\d\d\d\d\d\d\d 就是匹配一個電話號碼,可以簡寫爲0\d{2}-\d{8}
  8. \s 匹配任意的空白符,空格,製表符(Tab),換行
  9. \w 匹配字母,數字,下劃線,漢字等
  10. ^ 匹配字符串的開始
  11. $ 匹配字符串的結束
    • ^\d{6,9}$ 就是匹配所有6~9位的數字
  12. [] 匹配括號內的字符
    • [0-9] 就相當於\d
    • [matrix] 匹配m,a,t,r,i,x中的一個字符
    • \(?0\d{2}[) -]?\d{8} 就是匹配一個電話號碼
  13. | 或者
    • 上邊的匹配電話號碼有問題,(011-12345678 這樣的也會匹配
    • 那麼可以這樣修改 \(0\d{2}\)\d{8}|0\d{2}[ -]\d{8}
  14. () 分組
    • (\d{1,3}\.){3}\d{1,3} 可以是簡單的匹配IP地址,可惜,666.666.666.666這樣的也會被匹配進去,進一步改寫 ([01]?\d\d?|2[0-4]\d|25[0-5]\.){3}[01]?\d\d?|2[0-4]\d|25[0-5] 比較難想
  15. 反義:將字母變成大寫(好神奇)
    • \W 匹配任意不是字母,數字,下劃線,漢字的字符
    • \S 匹配任意不是空白的字符
    • \D 匹配任意不是數字的字符
    • \B 匹配任意不是單詞開始或結尾的位置
    • [^matrix] 匹配除了m,a,t,r,i,x以外的其他字符
    • <a[^>]+> 匹配尖括號內,以a開頭的字符串
  16. 使用小括號指定一個子表達式後,這個子表達式的文本可以被後邊所用,默認情況下,以每個左括號爲標準,從1開始標號
    • \b(\w+)\b\s+\1\b 表示匹配重複的單詞,比如matrix matrix等
  17. 當然也可以自己指定組名(?<name>exp) 表示的就是匹配exp的串,名字是name,捕獲時候\k<name> 即可
    • 上邊例子還可以寫爲\b(?<word>\w+)\b\s+\k<word>\b
  18. 零寬斷言,用於查找某些特定串的前面或後面的內容
    • (?=exp) 查找某些串,這些串的尾部是exp,查找結果是匹配的串減去尾部部分,比如\b\w+(?=ing\b) 查找I am singing while you are dancing時,結果爲sing和danc
    • (?<=exp) 查找某些串,這些串的頭部是exp,查找結果是匹配的串減去頭部部分,比如(?<=\bmat)\w+\b 查找I love matrix67 and matrix123是,結果爲rix67和rix123
    • 比如 (?<=\s)\d+(?=\s) 表示空白符間隔的數字
  19. 負向零寬斷言
    • (?!exp) 表示此位置後面不能匹配exp,比如\d{3}(?!\d) 匹配三位數字,並且這三位數字後面不是數字,比如\b((?!abc)\w)+\b 匹配不包含連續abc的單詞
    • (?<!exp) 表示此位置前面不能匹配exp,(?<![a-z])\d{7} 表示前面不是小寫字母的7位數字
  20. (?#comment) 添加註釋
  21. 貪婪與懶惰
    • 當匹配能接受重複的串時,通常是接受最長的串,也就是貪婪匹配,比如a.*b 是匹配以a爲開頭,以b爲結尾的所有的串,當匹配aabab時,匹配的是aabab
    • 有時候,我們希望匹配的儘可能短,可以這樣a.*?b 此時再匹配時,就是匹配的aab(0,2)和ab(3,4)
    • *? 重複儘可能少的次數
    • +? 重複一次或更多次,但儘可能少
    • ?? 重複0次或一次,儘可能少
    • {n,m}? 重複n到m次,儘可能少
    • {n,} 重複至少n次,儘可能少
  22. 處理選項
    • IgnoreCase 匹配時不區分大小寫
    • Multiline 多行模式,更改^, 的含義是匹配\n前的位置和字符串結束前的位置
    • Singleline 單行模式,更改.的含義,與每一個字符匹配(包括\n)
    • IgnorePatternWhitespace 忽略空白
    • ExplicitCapture 顯式捕獲,僅捕獲被顯式命名的組
  23. 遞歸匹配
    • (?'exp') 把捕獲的內容命名爲exp,並壓入堆棧
    • (?'-exp') 從堆棧上面彈出最後壓入的名爲exp的內容,如果堆棧本來爲空,匹配失敗
    • (?(exp)yes|no) 如果堆棧上存在名爲exp的內容,匹配yes部分的表達式,否則匹配no部分的表達式
    • (?!) 零寬負向先行斷言,由於沒有後綴表達式,試圖匹配總是失敗

至此,就對簡單的正則表達式有了一定的瞭解了

如果遇到不會的,可以到此查找

部分內容來自deerchao

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章