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
*列出变量中包含ck字符串的数据
list make if regexm(make, "ck") == 1
*列出变量make中以数字结尾的数据
list make if regexm(make, "[0-9]$") == 1
*生成新变量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
*清除内存数据
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
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地址 |