前端 | 2. 正則

清自以敬發表於2020-01-22

作者部落格:清自以敬

歡迎任何形式轉載,但請務必註明出處。

筆者會隨時更正文章內容,但由於筆者水平有限,如果文章或程式碼有錯誤或者表述不當之處,還望不吝賜教。

文章中的錯誤筆記連結

  • 如連結筆記出現頁面丟失,則筆記一般為私密狀態,完善ing,完善後會公開,還望見諒。
  • 如連結筆記是一個錯誤連結或者空連結,可以評論區回覆一下,筆者會修正連結。

上篇:前端 | 1. HTML&CSS

下篇:前端 | 3. JavaScript基礎


1.轉義

轉義的作用
當某個字元在表示式中具有特殊含義,例如字串引號中出現了引號,為了可以使用這些字元本身,而不是使用其在表示式中的特殊含義,則需要通過轉義符“\”來構建該字元轉義字元以正常使用。

規定的轉義字元表:
轉義字元

  • 紅框之上的字元還有“\0”都是非列印控制字元
  • 對於轉義符""的出現,都是具有特殊含義的,表示轉義符,所以轉義字元表對此規定了轉義字元\。
    最後的倆個形式則是為了表示ascii範圍內其他字元,以便特殊表示式的使用,例如對正則字元組中的^(脫字元),可以以\x5e表示

2.正規表示式初步

正則作用:規定了字串的組成規則,通過其匹配模式對目標字串進行匹配字元或位置。

2.1.匹配字元

正規表示式對字元的匹配,形象點就是橫向匹配和縱向匹配這兩個方式。
縱向就像密碼鎖一個播輪(例如字元組),橫向就像選擇播輪個數(例如量詞)

2.1.1.組成元素

字面量:正常的字元,用來精準匹配一個具體字元

字元組:

匹配一個符合方括號內邏輯的內的字元。

邏輯符號:^(非)、- (區間或)、直接拼接(或)。

案例:

1,[ac]:匹配元素==(a||c)
2,[^ac]:匹配元素!=(a&&c)

  • 方括號內開頭的^才被認為是邏輯判斷符號,其他位置都會被認為是字元元素

3, [a-c]:匹配元素==(a||b||c)
4,[0-2]:匹配元素==(0||1||2)
5,[02]:匹配元素==(0||2)

  • 允許在方括號內進行拼接以擴大範圍,例如[a-zA-Z0-9_],即匹配字母或者數字或者下劃線

  • 如果要匹配邏輯符號,則需要使用其轉義字元,或者破壞組合順序,比如[az^]

  • 一些常見的簡寫形式:

    • \d[0-9]
      d :digit(數字)
      大寫的\D則表示非數字[^0-9]
    • \w:[a-zA-Z0-9\_]
      w:word(單詞)
      大寫的\W則表示非單詞[^a-zA-Z0-9\_]
    • \s:[ \t\v\r\n\f]
      大寫S表示非空白
      s:space(空白)。表示空格、水平製表、垂直製表、回車(return,回到行首)、換行(newline,新行)、換頁(form feed,表單)
    • .:[^\n\r\u2028\u2029]。匹配除了換行符(\r\n)合行結束符(\u2028\u2029)

    組合上述即可得到萬用字元,如[\d\D][^]也表示萬用字元,不對任何字元做非操作自然就是任意字元。

量詞

匹配字元X的出現次數。量詞符號:?、+、*、{}

檢查模式:

1,貪婪型:儘可能多的檢查

  • X?:0||1

    ?可認為是詢問問有還是沒有

  • X+:>=1

  • X*:>=0

  • X{n}:==n

  • X{n,}:>=n

  • X{n,m}:[n,m]

2,懶惰型:儘可能少的檢查

  • 貪婪型基礎上多加個?即可。可理解為有沒有瞅到?瞅到就繼續走。

分支:

(p1|p2|…|pn),“|”表示分支,短路或進行匹配一個p,匹配到了一個就結束匹配。
"()"就是括號的作用。即標識整體

2.1.2.基礎正則的設計

分析值的構成情況,選擇縱向播輪範圍(字元組),選擇播輪個數(量詞),有必要再補上分支結構。

案例:

1,篩選可構成十六進位制色碼的部分:

  • #字面量,字元組為[0-9a-fA-F],3位或6位
  • #([0-9a-fA-F]{3}|[0-9a-fA-F]{6})

2,篩選可構成時分制時間的部分(24小時):

  • 4個位數字字元組和一個字面量“:”
  • 小時部分取值為0-24,([0-1]\d|2[0-3])
  • 分鐘為0-59,[0-5]\d
  • 結果:([0-1]\d|2[0-3]):[0-5]\d

如果對於例如01這樣的,允許只出現1,可以將0位選擇量詞"?"

即:(0?[0-9]|1[0-9]|2[0-3]):(0?\d|[1-5]\d)

3,篩選可構成年月日日期的部分(-連線):

  • 年4位字元組、月1位或2位字元組、日1為或2位字元組,字面量“-”連線。
  • 年:\d{4}
  • 月:(0?\d|1[0-2])
  • 日:(0?\d|[12]\d|3[01])

4,篩選可組成windows下絕對路徑的部分:

  • 碟符字元組,1位字元組和字面量":",[a-zA-Z]:\\
  • 分隔符轉義\\
  • 目錄層級剔除非法字元,貪婪型長度大於1,個數>=1。([^\\/:*?"<>|\s \u2088\u2029]+\\)*
  • 最終目標可能是個檔案,也可能是資料夾([^\/:*?"<>|\s \u2088\u2029]+)?

相關文章