摘要:[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}
基本的字元比對Notation
最簡單的比對方式,就是完全符合的比對。這就是一般的字串查詢,打什麼就查什麼。但是有時候只有模糊的想法,所以需要模糊比對。或是自己知道要查的字串是被兩個字串夾在中間,或是只要查某些字串開頭的文字。這些查詢規則,就可以透過Regex的語法描述出來,只要編輯器或閱讀器認得這些語法,它們就可以幫我們找到所需要的資訊。
對單一字元的Notation的用法如下:
字元
: 完全符合的比對,例如a
表示要找a
這個字元。[abc]
: 這個字元可能是a
或b
或c
[^abc]
: 這個字元是除了a
b
c
以外的所有字元[a-zA-Z]
: 這個字元是a
到z
或是A
到Z
。
如果要找英文字母及數字
,可以使用[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個部分
0
: 第一個字元是0
\d{1,2}
: 接下來的字元是0-9的數字,可以允許1個或2個-
: 第三個字元是-
\d{6,8}
: 最後是的字元是0-9的數字,可以允許6~8個
了解了這個Pattern後,很容易就會知道底下這些是符合的:
- 01-123456
- 012-1234567
- 012-12345678
而底下這是不符合的
- 01123456(沒有
-
) - 12345678(沒有區碼)
- (03)12345678(使用括弧而非橫槓)
- 022-12345(號碼長度不符)