Leon's Blogging

Coding blogging for hackers.

正規表示式 Regular Expression

| Comments

在網頁中經常要確認一些格式,像是身分證格式必須要 10 碼,開頭是大寫 A-Z ,第二個數字必須是 1 or 2,這時就能夠用 Regular Expression 來做判斷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
身份證
/[A-Z][12]\d{8}/

信箱
/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

不允許信箱中有多個點
/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

URL
/(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix

#group
bot_name(<@U2B3X5R3L>)
/^(?<bot>[[:alnum:][:punct:]@<>]*)$/u

(How is the weather in xxx?)
/^How is the weather in (?<location>\w*)\?$/i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/\A[\w+\-.]@[a-z\d\-.]\.[a-z]+\z/i
#完整的正則表達式
/
#正則表達式開始
\A
#匹配字符串的開頭
[\w+\-.]+
#一個或多個字母、加號、連字符、或點號
@
#匹配 @ 符號
[a-z\d\-.]+
#一個或多個字母、數字、連字符或點號
\.
#匹配點號
[a-z]+
#一個或多個字母
\z
#匹配字符串結尾
/
#結束正則表達式
i
#不區分大小寫

範例

1
2
3
4
5
6
7
8
9
10
11
regex = /([A-Z])([12])\d{8}/  #前面兩個()起來代表是有意義的,可以連同存取起來

match = "A123456789".match(regex)
#=> #<MatchData "A123456789" 1:"A" 2:"1">

match[0]
#=> "A123456789"
match[1]
#=> "A"
match[2]
#=> "1"

Regex quick reference

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[abc]   #A single character of: a, b, or c
[^abc]   #Any single character except: a, b, or c
[a-z]  #Any single character in the range a-z
[a-zA-Z] #Any single character in the range a-z or A-Z

^  #Start of line => /^ab/,開頭兩個有 ab 即可
$    #End of line => /ab$/,後面兩個有 ab 即可

\A  #Start of string
\z  #End of string
.  #Any single character

\s = [ \r\t\n\f] #Any whitespace character
\S = [^ \r\t\n\f] #Any non-whitespace character

\d = [0-9]  #Any digit
\D = [^0-9]  #Any non-digit

\w = [a-zA-Z0-9_] #Any word character (letter, number, underscore)
\W = [^a-zA-Z0-9_] #Any non-word character

\b  #Any word boundary
(...)  #Capture everything enclosed
(a|b)  #a or b

a? #Zero or one of a
a*  #Zero or more of a
a+  #One or more of a

a{3} #Exactly 3 of a
a{3,}    #3 or more of a
a{,6}    #ths most 6 of a
a{3,6}    #Between 3 and 6 of a

options:
i #case insensitive
m #make dot match newlines
x #ignore whitespace in regex
o #perform #{...} substitutions only once

Sed 工具

sed 工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sed (stream editor) 可以分析 Standard Input (STDIN) 的資料,進行取代、刪除、新增、擷取特定行等處理後,再輸出到 standrad out (STDOUT)
sed 指令
[root@linux ~]# sed [-nefr] [動作]

選項:
-n  :使用安靜 (silent) 模式。在一般 sed 的用法中,所有來自 STDIN
      的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過
      sed 特殊處理的那一行(或者動作)才會被列出來。
-e  :直接在指令列模式上進行 sed 的動作編輯;
-f  -f filename 可以執行 filename 內的 sed 動作;
-r  sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i  :直接修改讀取的檔案內容,而不是由螢幕輸出。

動作說明:  [n1[,n2]]function
n1, n2 :選擇進行動作的行數,例如,『10,20[動作行為] 

function
a   :新增, a 的後面可以接字串,這些字串會在目前的下一行出現。
c   :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行。
d   :刪除, d 後面通常不接任何字串;
i   :插入, i 的後面可以接字串,這些字串會在目前的上一行出現;
p   :列印,將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作。
s   :取代,s 的動作可以搭配正規表示法。例如 1,20s/old/new/g 

參考文件:

練習:

Comments