[Regular Expression]語法筆記1-基本介紹

  • 2696
  • 0
  • 2016-03-05

摘要:[Regular Expression]語法筆記1-基本介紹
egex語法雖然看起來有些複雜,其實主要就是做兩件事情,設定文字比對的樣式,以及設定重複的次數。

自己覺得Regulare Expression(Regex)實在是不好懂的東西,每次用過就忘。打算就寫個筆記,可以隨時新增自己理解到的用法,也可以隨時參考。目前的瞭解是,Regex語法雖然看起來有些複雜,其實主要就是做兩件事情,設定文字比對的樣式,以及設定重複的次數

要繼續了解及學習之前,最好是有一個好用的Regular Expression檢測器。網路上一搜尋,可以找到許多的工具,甚至自己簡單寫一個也可以。目前我使用的是這個-線上檢測器-Regex101。它的好處是,在輸入Regular Expression的時候,會自動高亮顯示語法,同時還會有語法的解釋。當語法發生問題時,也會顯示錯誤的原因。唯一比較麻煩的是,他只有英文介面,所以看起來會稍微吃力一點。

文字比對的樣式

基本的語法結構

目前的瞭解是,Regular Expression是基於單一字元設定比對樣式的,並且將這些比對樣式合併起來。所以要看懂他的語法,其實就是拆解並分析個別的字元比對樣式的過程。

例如這個電話號碼的Regex

0\d{1,2}-\d{6,8}

可以拆成4個字元比對樣式,0, \d{1,2}, -, \d{6,8}

image

基本的字元比對Notation

最簡單的比對方式,就是完全符合的比對。這就是一般的字串查詢,打什麼就查什麼。但是有時候只有模糊的想法,所以需要模糊比對。或是自己知道要查的字串是被兩個字串夾在中間,或是只要查某些字串開頭的文字。這些查詢規則,就可以透過Regex的語法描述出來,只要編輯器或閱讀器認得這些語法,它們就可以幫我們找到所需要的資訊。

對單一字元的Notation的用法如下:

  • 字元: 完全符合的比對,例如 a 表示要找a這個字元。
  • [abc] : 這個字元可能是abc
  • [^abc] : 這個字元是除了a b c 以外的所有字元
  • [a-zA-Z] : 這個字元是az或是AZ

如果要找英文字母及數字,可以使用[a-zA-Z1-9]這個Notation。但是,還有更簡單的寫法 - \w。Regex定義了一些Notation,用來描述常用的規則。

  • \d : digit(數字)0-9。
  • \D : 非數字的集合。
  • \s : space(空白)的字元,也就是 (空白)、\t\n
  • \S : 非空白的字元。
  • \w : word(文字) a-z A-Z _ 0-9,所有的英文大小寫,數字和底線。
  • \W : 非文字的字元。
  • .(句點) : 除了換行符號\n之外的任一字元。

基本的字串比對

2個以上的字元放在一起,就變成字串了。字串比對本質上就是完全符合的比對,就沒有\d\D之類的Notation。頂多使用|作為or的指令,例如

abc|def

這一個Regex是指abc字串或是def字串。

要注意到,如果最外面加上一個中括號[],這樣就會變成字元的比對了,例如

[abc|def]

這一個Regex則是指a,b,c,d,e,f這6個字元都允許

重複的次數

設定字元比對的樣式後,還需用以下的Notatoin設定字元或字串(Group)重複的次數。

  • ?: 出現一次或不出現 例如 a?
  • +: 出現一次或一次以上, 例如 a+
  • *: 出現任何次或不出現 例如 a*
  • {n}: 重複n次
  • {n,m}: 重複n到m次
  • {n,}: 重複至少n次

到這裡為止,就足以看懂一些簡單的Regex了。如之前的範例

0\d{1,2}-\d{6,8}

這是台灣電話號碼的Regex,可以拆成4個部分

image

  1. 0: 第一個字元是0
  2. \d{1,2}: 接下來的字元是0-9的數字,可以允許1個或2個
  3. -: 第三個字元是 -
  4. \d{6,8}: 最後是的字元是0-9的數字,可以允許6~8個

了解了這個Pattern後,很容易就會知道底下這些是符合的:

  • 01-123456
  • 012-1234567
  • 012-12345678

而底下這是不符合的

  • 01123456(沒有-)
  • 12345678(沒有區碼)
  • (03)12345678(使用括弧而非橫槓)
  • 022-12345(號碼長度不符)

參考: