正则表达式(一)

正则表达式(一)

元字符

元字符(metacharacters)是按照一定规则限制表示的字符。

  1. .匹配所有字符

  2. []匹配方括号内的所有字符,这个字符按照原样,即使是具有特殊意义的字符,如',$,>,+'等都是保持字符本意\-除外

  3. [^c1c2]c3c4不匹配'c1,c2',即不带有c1,c2的c3c4字符串

  4. [c1-c2]匹配c1到c2之间的所有字符

  5. \w匹配任意单个数字,字符串或者下划线,等价于[a-zA-Z_1-9]\w*匹配多个连续字符\w{N}匹配N个连续字符

1
2
3
OriginStr = 'spain remain contain aint retain ';
AnsStr = regexp(OriginStr,'\w*','match');
PosStr = regexp(OriginStr,'\w*');

1
2
3
4
5
6
7
8
9
10
11
PosStr =

1 7 14 22 27 33

>> AnsStr

AnsStr =

1×5 cell 数组

{'spain'} {'remain'} {'contain'} {'aint'} {'retain'}

可以看出,这个得到的是所有的匹配。而且对于语句regexp(OriginStr,MatchStr,'option'),如果不加option的话,就是得到匹配的一个字符的位置,如果加上optionmatch的话,就是得到匹配的值。

1
2
OriginStr = '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的前缀都包括的一串字符串。

  1. \W是匹配\w的补集,\W*\w*含义一致\W{N}\w{N}含义一致。
  2. \s等价于[ \f\t\r\n\v],匹配空白字符
  3. \S等价于[^\f\t\r\n\v]匹配非空白字符 tips:小写字母和大写字母的含义往往是补集的关系
  4. \d匹配单个十进制数\d*匹配多个 tips*匹配多个
  5. D\d的补集,即匹配除了数字以外的所有字符,等价于[^\d]
  6. \oN\o{N}匹配八进制数N
  7. \xN匹配\x{N}匹配十六进制数N

表达式

expr,表达式,这个也就是对于一串字符串,即xp=x&p[xp]=x|p,即不加[]是且关系,加了[]是或关系,表达式是限定符前面构成的所有字符构成的匹配字符串。

转义字符

char(10)=\n,即回车。

1
2
3
str = ['some',char(10),'text']
regexp(str,'\n')
regexp(str,'\n','match')

输出为

1
2
3
4
5
6
7
8
str =
'some
text'
ans =
5
ans =
1×1 cell 数组
{'?'}
转义字符 描述 示例
\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} 限定符
^, $, 位置和顺序
| “或”操作