1. 前言
在目前工作中,用stata清洗及分析數(shù)據(jù)王悍,感覺很順滑破镰。無奈不少同學因為help文件里的英文望而卻步。
帶著學習和分享的目的,根據(jù)工作經(jīng)驗鲜漩,給大家整理一些常用以及不太常用但很有用的命令源譬,并對該命令的help文件進行有側重的詳解。
2. 描述
regexm(s,re)
:字符串函數(shù)孕似。字符串匹配函數(shù)踩娘。當字符串s
符合正則表達式re
時,返回1鳞青,否則返回0.
regexr(s1,re,s2)
:字符串函數(shù)霸饲。字符串替換函數(shù)。將符合正則表達式re
的字符串s1
中的第一個子字符串替換未字符串s2
臂拓,并返回替換后的結果字符串厚脉。
- 當字符串
s1
中不包括符合正則表達式re
的子字符串時,返回字符串s1
胶惰。
regexs(n)
:字符串函數(shù)傻工。與regexr
結合使用。返回regexm(s,re)
第n個子表達式對應的子字符串孵滞。如果n=0中捆,則表示返回所有符合正則表達式的字符串。
3. 參數(shù)
regexm(s,re)
:
s
:ASCII碼的字符串
re
:正則表達式
regexr(s1,re,s2)
:
s1
:ASCII碼的字符串
re
:正則表達式
s2
:ASCII碼的字符串
regexs(n)
:
n
:取值范圍:0 ≤ n < 10
4. 舉例
*調(diào)入自帶數(shù)據(jù)auto
sysuse auto
*列出變量make中以B字母開頭的數(shù)據(jù)
generate bbegin = regexm(make, "^B")
list make if bbegin == 1
*同上
list make if regexm(make, "^B") == 1
*列出變量中包含ck字符串的數(shù)據(jù)
list make if regexm(make, "ck") == 1
*列出變量make中以數(shù)字結尾的數(shù)據(jù)
list make if regexm(make, "[0-9]$") == 1
*生成新變量make2(通過復制變量make)
generate make2 = make
*將變量make2中以B字母開頭坊饶,3個數(shù)字+小寫字母結尾的數(shù)據(jù)替換成found
replace make2 = regexr(make2, "^B.*[0-9][0-9][0-9][a-z]$", "found")
*將變量make和make2不一樣的兩個變量顯示出來
list make make2 if make != make2
*清除內(nèi)存數(shù)據(jù)
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]+,即括號中的數(shù)字的字符串匿级;regexs(2)表示符合第2個子表達式.*蟋滴,即)后的所有內(nèi)容。
gen str newnum = regexs(1) + "-" + regexs(2) if regexm(number,"^\(([0-9]+)\) (.*)")
*列出變量number和newnum
l number newnum
5.補充
- 上述例子中涉及正則表達式(regular expression)中的元字符
元字符 | 含義 | 舉例 |
---|---|---|
\ | 后向引用痘绎,后面跟正則表達式中的某個元字符津函,表示匹配該符號。類似于轉義孤页。 |
\\ 匹配\ 尔苦;\- 匹配- 。 |
^ | 在表達式的開頭位置行施,表示接下來的表達式所要匹配的內(nèi)容位于字符串的開始的位置允坚。 |
^B 表示以B 開頭;^\ (表示以( 開頭 |
$ | 在表達式的結尾位置悲龟,表示錢買你的表達式所要匹配的內(nèi)容位于字符串結尾的位置屋讶。 |
[0-9]$ 表示以數(shù)字結尾 |
* | 表示將前一個字符或子表達式匹配任意次數(shù),可以為0次须教。 |
XY* 可以匹配X 皿渗,也可以匹配XY ,XYY ,XY.....Y 斩芭。 |
+ | 表示將前一個字符或子表達式匹配至少1次。 |
XY+ 可匹配XY ,XYY ,XY.....Y 乐疆,但不可匹配X 划乖。 |
? | 表示將前一個字符或子表達式匹配0次或1次。 |
XY? 可匹配X 或XY
|
{n} | n為一個非負整數(shù)挤土,表示將前一個字符或子表達式匹配n次琴庵。 |
XY{2} 匹配XYY ;只能用于以ustr 開頭的4個正則表達式的字符串函數(shù)中 |
. | 表示可以匹配任意字符 |
.* 可以匹配任意字符或者不匹配任何字符仰美。 |
() | 創(chuàng)建一個子表達式迷殿,可以提取或者替換括號內(nèi)的子表達式對應的字符串 |
^\(([0-9]+)\) (.*) 可拆成^ ,\( ,([0-9]+) ,\) ,(.*) ,其中,([0-9]+) ,(.*) 為子表達式 |
- | 指定一個范圍 |
a-z :字母a到字母z范圍的小寫字母;A-Z :字母A到字母Z范圍的大寫字母咖杂;0-9 :數(shù)值0-9范圍內(nèi)的數(shù)字庆寺。 |
[] | 方括號內(nèi)的字符之一被用來進行匹配 |
[a-z] 可以匹配a-z范圍內(nèi)的任意小寫字母 |
來源:http://www.360doc.com/content/16/1223/13/39103730_617058825.shtml
- 序列
正則表達式 | 含義 |
---|---|
\d |
匹配數(shù)字字符 |
\D |
匹配非數(shù)字字符 |
\s |
匹配間隔符(空格) |
\S |
匹配非間隔符(非空格) |
\w |
匹配單詞字符 |
\W |
匹配非單詞字符 |
\b |
匹配詞界 |
\B |
匹配非詞界 |
- 常用正則表達式
正則表達式 | 含義 |
---|---|
[\u4e00-\u9fa5] |
匹配中文字符 |
[^\x00-\xff] |
匹配雙字節(jié)字符(包括漢字在內(nèi)) |
\n\s*\r |
匹配空白行 |
<(\S*?)[^>]*>.*?</\1>|<.*? /> |
匹配HTML標記 |
^\s*|\s*$ |
匹配首尾空白字符 |
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* |
匹配Email地址 |
[a-zA-z]+://[^\s]* |
匹配網(wǎng)址URL |
^[a-zA-Z][a-zA-Z0-9_]{4,15}$ |
匹配帳號是否合法(字母開頭,允許5-16字節(jié)诉字,允許字母數(shù)字下劃線) |
\d{3}-\d{8}|\d{4}-\d{7} |
匹配國內(nèi)電話號碼 |
[1-9][0-9]{4,} |
匹配騰訊QQ號(騰訊QQ號從10000開始) |
[1-9]\d{5}(?!\d) |
匹配中國郵政編碼(中國郵政編碼為6位數(shù)字) |
\d{15}|\d{18} |
匹配身份證(中國的身份證為15位或18位) |
\d+\.\d+\.\d+\.\d+ |
匹配ip地址 |