什麼是正規表示式?
Regular Expression (正規表示式)是指一組能用來表示字串共同格式 (common structure)的樣式 (Pattern),像是@符號會固定出現在email中,或是手機號碼固定是10碼,等等樣式。
在所有的程式語言中,只要用到字串比對與字串取代等字串相關功能,都會用到正規表示式。雖然正規表示式在不同程式語言中會有些許差異,但核心概念是相同的。
以下是常見的範例:
| 語法 | 正則表達式 | 範例 |
|---|---|---|
| 整數 | [0-9]+ | 5815 |
| 浮點數 | [0-9]+.[0-9]+ | 58.15 |
| 純英文字串 | [A-Za-z]+ | CGUIM |
| [a-zA-Z0-9]+@[a-zA-Z0-9.]+ | im@mail.cgu.edu.tw |
|
| URL | http://[a-zA-Z0-9./_]+ |
http://www.is.cgu.edu.tw/ |
可以用正規表示式的R函數
- grep()
- grepl()
- gsub()
- str_split()
- stringr package中的諸多函數
正規表示式的語法
逃脫字元
*\*
表示數量的語法
*: 出現0~無限多次+: 出現1~無限多次?: 出現0~1次{n}: 出現n次{n,}: 出現n~無限多次{n,m}: 出現n~m次
stringVector<-c("a","abc","ac","abbc","abbbc","abbbbc")
grep("ab*",stringVector,value=T)
## [1] "a" "abc" "ac" "abbc" "abbbc" "abbbbc"
grep("ab+",stringVector,value=T)
## [1] "abc" "abbc" "abbbc" "abbbbc"
grep("ab?c",stringVector,value=T)
## [1] "abc" "ac"
grep("ab{2}c",stringVector,value=T)
## [1] "abbc"
grep("ab{2,}c",stringVector,value=T)
## [1] "abbc" "abbbc" "abbbbc"
grep("ab{2,3}c",stringVector,value=T)
## [1] "abbc" "abbbc"
表示位置的語法
^: 出現在字串開始的位置$: 出現在字串結束ˇ的位置\b: 出現空字串(空白)開始或結束的位置\B: 出現非字串開始或結束的位置
stringVector<-c("abc","bcd","cde","def","abc def","bcdefg abc")
grep("^bc",stringVector,value=T)
## [1] "bcd" "bcdefg abc"
grep("bc$",stringVector,value=T)
## [1] "abc" "bcdefg abc"
grep("\\bde",stringVector,value=T)
## [1] "def" "abc def"
grep("\\Bde",stringVector,value=T)
## [1] "cde" "bcdefg abc"
運算子
.: 出現所有的字元一次,包括空字串[...]: 出現字元清單(…)中的字元一次,可用-表示範圍,如[A-Z],[a-z],[0-9][^...]: 不出現字元清單(…)中的字元\: 要搜尋字串中的特殊字元時,前方須加上\|: 或
stringVector<-c("03-2118800","02-23123456","0988123456",
"07-118","0-888","csim@mail.cgu.edu.tw","csim@.","csim@",
"http://www.is.cgu.edu.tw/")
grep("[0-9]{2}-[0-9]{7,8}",stringVector,value=T)
## [1] "03-2118800" "02-23123456"
grep("[0-9]{10}",stringVector,value=T)
## [1] "0988123456"
grep("02|03",stringVector,value=T)
## [1] "03-2118800" "02-23123456"
grep("[a-zA-Z0-9_]+@[a-zA-Z0-9._]+",stringVector,value=T)
## [1] "csim@mail.cgu.edu.tw" "csim@."
特殊符號
\d: 數字,等於 [0-9]\D: 非數字,等於 [^0-9][:lower:]: 小寫字,等於 [a-z][:upper:]: 大寫字,等於 [A-Z][:alpha:]: 所有英文字,等於 [[:lower:][:upper:]] or [A-z][:alnum:]: 所有英文字和數字,等於 [[:alpha:][:digit:]] or [A-z0-9]\w: 文字數字與底線,等於 [[:alnum:]] or [A-z0-9]\W: 非文字數字與底線,等於 [^A-z0-9_][:blank:]: 空白字元,包括空白和tab\s: 空白字元,\S: 非空白字元[:punct:]: 標點符號 ! “ # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~.
stringVector<-c("03-2118800","02-23123456","0988123456",
"07-118","0-888","csim@mail.cgu.edu.tw","http://www.is.cgu.edu.tw/")
grep("\\d{2}-\\d{7,8}",stringVector,value=T)
## [1] "03-2118800" "02-23123456"
grep("\\d{10}",stringVector,value=T)
## [1] "0988123456"
grep("\\w+@[a-zA-Z0-9._]+",stringVector,value=T)
## [1] "csim@mail.cgu.edu.tw"
參考資料
PREVIOUSR與2018年狗年行大運 ^_^