正则表达式(一)
正则表达式(一)
元字符
元字符(metacharacters)是按照一定规则限制表示的字符。
.匹配所有字符[]匹配方括号内的所有字符,这个字符按照原样,即使是具有特殊意义的字符,如',$,>,+'等都是保持字符本意\-除外[^c1c2]c3c4不匹配'c1,c2',即不带有c1,c2的c3c4字符串[c1-c2]匹配c1到c2之间的所有字符\w匹配任意单个数字,字符串或者下划线,等价于[a-zA-Z_1-9],\w*匹配多个连续字符\w{N}匹配N个连续字符
1
2
3OriginStr = 'spain remain contain aint retain ';
AnsStr = regexp(OriginStr,'\w*','match');
PosStr = regexp(OriginStr,'\w*');
1
2
3
4
5
6
7
8
9
10
11PosStr =
1 7 14 22 27 33
>> AnsStr
AnsStr =
1×5 cell 数组
{'spain'} {'remain'} {'contain'} {'aint'} {'retain'}
可以看出,这个得到的是所有的匹配。而且对于语句regexp(OriginStr,MatchStr,'option'),如果不加option的话,就是得到匹配的一个字符的位置,如果加上option为match的话,就是得到匹配的值。
1
2OriginStr = 'spain remain contain aint retain ';
AnsStr = regexp(OriginStr,'\w* ain','match');
1
2
3
4
5
6
7>> AnsStr
AnsStr =
1×1 cell 数组
{'contain ain'}
可以看到,AnsStr输出的contain ain,即匹配ain的前缀都包括的一串字符串。
\W是匹配\w的补集,\W*跟\w*含义一致\W{N}和\w{N}含义一致。\s等价于[ \f\t\r\n\v],匹配空白字符\S等价于[^\f\t\r\n\v]匹配非空白字符 tips:小写字母和大写字母的含义往往是补集的关系\d匹配单个十进制数\d*匹配多个 tips*匹配多个D是\d的补集,即匹配除了数字以外的所有字符,等价于[^\d]\oN和\o{N}匹配八进制数N\xN匹配\x{N}匹配十六进制数N
表达式
expr,表达式,这个也就是对于一串字符串,即xp=x&p,[xp]=x|p,即不加[]是且关系,加了[]是或关系,表达式是限定符前面构成的所有字符构成的匹配字符串。
转义字符
char(10)=\n,即回车。
1 | str = ['some',char(10),'text'] |
输出为
1 | str = |
| 转义字符 | 描述 | 示例 |
|---|---|---|
\a |
警告 | char(7) |
\b |
退格 | char(8) |
\f |
换页符 | char(12) |
\n |
换行符 | char(10) |
\r |
回车 | char(13) |
\t |
水平制表符 | char(9) |
\v |
垂直制表符 | char(11) |
\char |
任意特殊字符 | - |
限定符
| 限定符 | 含义 |
|---|---|
| expr * | 多次expr:0~∞ |
| expr ? | 一次expr:0~1 |
| expr + | 一次到多次expr:1~∞ |
| expr{m,n} | m到n次expr:m~n |
| expr{m,} | 大于等于m次expr:m~∞ |
| expr{m} | m次expr:=m |
expr*代表匹配0次或者多次,与任意多个字符匹配1
2
3
4
5
6
7>> regexp('12--asdf--45dfg','\w*','match')
ans =
1×3 cell 数组
{'12'} {'asdf'} {'45dfg'}expr?代表至多匹配1次1
2
3
4
5
6
7>> regexp('12--asdf--45dfg','\w?','match')
ans =
1×11 cell 数组
{'1'} {'2'} {'a'} {'s'} {'d'} {'f'} {'4'} {'5'} {'d'} {'f'} {'g'}expr+匹配一次或者连续多次1
2
3
4
5
6
7>> regexp('12--asdf--45dfg','\w+','match')
ans =
1×3 cell 数组
{'12'} {'asdf'} {'45dfg'}expr{m,n}匹配m~n次,{0,1}='?'1
2
3
4
5
6
7>> regexp('12--asdf--45dfg','\w{1,3}','match')
ans =
1×5 cell 数组
{'12'} {'asd'} {'f'} {'45d'} {'fg'}expr{m,}匹配≥m次,{0,}='*';{1,}='+'expr{n}匹配n次,n={n,n}
模式
表达式+限定词=模式
| 表达式+限定词 | 描述 | 示例 |
|---|---|---|
| expr q | 积极表达式:与尽可能多的expr匹配 | 给定文本 <tr><td><p>text</p></td>,表达式 </?t.*>与介于 <tr 和 /td> 之间的所有字符匹配: |
<tr><td><p>text</p></td> |
||
| expr q? | 消极表达式:与所需尽可能少的expr匹配 | 给定文本<tr><td><p>text</p></td>,表达式 </?t.*?> 在第一次出现右尖括号 (>) 时结束每个匹配项: |
<tr> <td> </td> |
||
| expr q+ | 主动表达式:最大程度的匹配 | 给定文本 <tr><td><p>text</p></td>,表达式 </?t.*+> 不返回任何匹配项,这是因为右尖括号是使用 .* 捕获的且不进行重新扫描。空 {} |
积极表达式:碰到符合条件的,就从开始处匹配到结尾,格式为
expr q,q为任意限定符。1
2
3
4
5
6
7>> regexp('<txr><txd><p>text</p></tpd>', '</?t.*>' ,'match')
ans =
1×1 cell 数组
{'<txr><txd><p>text</p></tpd>'}消极模式:只要匹配就立即停止搜索,进行下一次匹配,格式为
expr q?如1
2
3
4
5
6
7>> regexp('<txr><txd><p>text</p></tpd>', '</?t.*?>' ,'match')
ans =
1×3 cell 数组
{'<txr>'} {'<txd>'} {'</tpd>'}主动模式:最大程度的匹配,格式为
expr q+,如1
2
3
4
5
6
7
8
9
10
11
12
13>> regexp('<txr><txd><p>text</p></tpd>', '</?t.*+>' ,'match')
ans =
空的 0×0 cell 数组
>> regexp('<txr><txd><p>text</p></tpd>', '<t.*+' ,'match')
ans =
1×1 cell 数组
{'<txr><txd><p>text</p></tpd>'}
主动模式较难理解,我觉得可以这样看,他就就是直接把检测到开头的<字符就开始匹配,知道匹配到无可匹配也就是>为止,这时候才到达匹配模式里面的?部分,所以如果?后面有任何的字符,这个匹配出来的都是空字符串。
这个匹配模式跟匹配出来的结果就是两个,一个是最后一位是?,这时候等价于expr *,最后一位不是?,这时候结果是空字符串。
操作符的优先级
| 操作符 | 描述 |
|---|---|
| \ | 转义符 |
| (), (?:), (?=), [] | 圆括号和方括号 |
| *, +, ?, {n}, {n,}, {n,m} | 限定符 |
| ^, $, | 位置和顺序 |
| | | “或”操作 |