1. 前言
在目前工作中,用stata清洗及分析數據,感覺很順滑。無奈不少同學因為help文件里的英文望而卻步。
帶著學習和分享的目的,根據工作經驗,給大家整理一些常用以及不太常用但很有用的命令,并對該命令的help文件進行有側重的詳解。
2. 描述
regexm(s,re)
:字符串函數。字符串匹配函數。當字符串s
符合正則表達式re
時,返回1,否則返回0.
regexr(s1,re,s2)
:字符串函數。字符串替換函數。將符合正則表達式re
的字符串s1
中的第一個子字符串替換未字符串s2
,并返回替換后的結果字符串。
- 當字符串
s1
中不包括符合正則表達式re
的子字符串時,返回字符串s1
。
regexs(n)
:字符串函數。與regexr
結合使用。返回regexm(s,re)
第n個子表達式對應的子字符串。如果n=0,則表示返回所有符合正則表達式的字符串。
3. 參數
regexm(s,re)
:
s
:ASCII碼的字符串
re
:正則表達式
regexr(s1,re,s2)
:
s1
:ASCII碼的字符串
re
:正則表達式
s2
:ASCII碼的字符串
regexs(n)
:
n
:取值范圍:0 ≤ n < 10
4. 舉例
*調入自帶數據auto
sysuse auto
*列出變量make中以B字母開頭的數據
generate bbegin = regexm(make, "^B")
list make if bbegin == 1
*同上
list make if regexm(make, "^B") == 1
bbegin.png
*列出變量中包含ck字符串的數據
list make if regexm(make, "ck") == 1
ck.png
*列出變量make中以數字結尾的數據
list make if regexm(make, "[0-9]$") == 1
digit.png
*生成新變量make2(通過復制變量make)
generate make2 = make
*將變量make2中以B字母開頭,3個數字+小寫字母結尾的數據替換成found
replace make2 = regexr(make2, "^B.*[0-9][0-9][0-9][a-z]$", "found")
*將變量make和make2不一樣的兩個變量顯示出來
list make make2 if make != make2
make2.png
*清除內存數據
clear
*輸入變量number
input str15 number
number
1. "(123) 456-7890"
2. "(800) STATAPC"
3. end
*將變量number中的(123) 456-7890轉為123-456-7890形式,其中,regexs(1)表示符合第1個子表達式[0-9]+,即括號中的數字的字符串;regexs(2)表示符合第2個子表達式.*,即)后的所有內容。
gen str newnum = regexs(1) + "-" + regexs(2) if regexm(number,"^\(([0-9]+)\) (.*)")
*列出變量number和newnum
l number newnum
number.png
5.補充
- 上述例子中涉及正則表達式(regular expression)中的元字符
元字符 | 含義 | 舉例 |
---|---|---|
\ | 后向引用,后面跟正則表達式中的某個元字符,表示匹配該符號。類似于轉義。 |
\\ 匹配\ ;\- 匹配- 。 |
^ | 在表達式的開頭位置,表示接下來的表達式所要匹配的內容位于字符串的開始的位置。 |
^B 表示以B 開頭;^\ (表示以( 開頭 |
$ | 在表達式的結尾位置,表示錢買你的表達式所要匹配的內容位于字符串結尾的位置。 |
[0-9]$ 表示以數字結尾 |
* | 表示將前一個字符或子表達式匹配任意次數,可以為0次。 |
XY* 可以匹配X ,也可以匹配XY ,XYY ,XY.....Y 。 |
+ | 表示將前一個字符或子表達式匹配至少1次。 |
XY+ 可匹配XY ,XYY ,XY.....Y ,但不可匹配X 。 |
? | 表示將前一個字符或子表達式匹配0次或1次。 |
XY? 可匹配X 或XY
|
{n} | n為一個非負整數,表示將前一個字符或子表達式匹配n次。 |
XY{2} 匹配XYY ;只能用于以ustr 開頭的4個正則表達式的字符串函數中 |
. | 表示可以匹配任意字符 |
.* 可以匹配任意字符或者不匹配任何字符。 |
() | 創建一個子表達式,可以提取或者替換括號內的子表達式對應的字符串 |
^\(([0-9]+)\) (.*) 可拆成^ ,\( ,([0-9]+) ,\) ,(.*) ,其中,([0-9]+) ,(.*) 為子表達式 |
- | 指定一個范圍 |
a-z :字母a到字母z范圍的小寫字母;A-Z :字母A到字母Z范圍的大寫字母;0-9 :數值0-9范圍內的數字。 |
[] | 方括號內的字符之一被用來進行匹配 |
[a-z] 可以匹配a-z范圍內的任意小寫字母 |
來源:http://www.360doc.com/content/16/1223/13/39103730_617058825.shtml
- 序列
正則表達式 | 含義 |
---|---|
\d |
匹配數字字符 |
\D |
匹配非數字字符 |
\s |
匹配間隔符(空格) |
\S |
匹配非間隔符(非空格) |
\w |
匹配單詞字符 |
\W |
匹配非單詞字符 |
\b |
匹配詞界 |
\B |
匹配非詞界 |
- 常用正則表達式
正則表達式 | 含義 |
---|---|
[\u4e00-\u9fa5] |
匹配中文字符 |
[^\x00-\xff] |
匹配雙字節字符(包括漢字在內) |
\n\s*\r |
匹配空白行 |
<(\S*?)[^>]*>.*?</\1>|<.*? /> |
匹配HTML標記 |
^\s*|\s*$ |
匹配首尾空白字符 |
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* |
匹配Email地址 |
[a-zA-z]+://[^\s]* |
匹配網址URL |
^[a-zA-Z][a-zA-Z0-9_]{4,15}$ |
匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線) |
\d{3}-\d{8}|\d{4}-\d{7} |
匹配國內電話號碼 |
[1-9][0-9]{4,} |
匹配騰訊QQ號(騰訊QQ號從10000開始) |
[1-9]\d{5}(?!\d) |
匹配中國郵政編碼(中國郵政編碼為6位數字) |
\d{15}|\d{18} |
匹配身份證(中國的身份證為15位或18位) |
\d+\.\d+\.\d+\.\d+ |
匹配ip地址 |