正则表达式(一)
正则表达式(一)
元字符
元字符(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} | 限定符 |
^, $, | 位置和顺序 |
| | “或”操作 |