正则表达式 组合与锚点
单字符正则表达式的组合
串结
如abc
串结在一起,可以匹配abc本身。
如[A-Z].[0-9].
串结在一起,可以匹配AA00
。
星号(*)
单字符正则表达式后跟*
,表示匹配这个单字符正则表达式的0次或任意多次。
例:正则表达式12*4
与字符串1234不匹配,与1224,12224,14匹配
例:正则表达式[A-Z][0-9]*
此例中*
作用的单字符正则表式为[0-9]
,代表
1 | [A-Z] |
这与A
,A1
,C45
,D768
匹配,与b64512
,T56t
不匹配。
例:正则表达式[Cc]hapter *[1-4]
在*号前有一个空格,允许数字1-4之前有多个或者0个空格。可匹配Chapter2
,chapter 3
等等。
例:正则表达式a\[i] *= *b\[j] *\* *c\[k]
匹配字符串a[i]=b[j]*c[k]
,容许等号和星号两侧有空格
例:在vi中使用正则表达式:1,$s/[0-9]*/xx/g
,1,$
表示从第1行到最后一行,s/[0-9]*/_/g
表示把一行的所有的数字全部替换成_
。
需要注意的是
1 | 123 123 234 123 |
替换结果:
1 | _ _ _ _ |
需要注意的是当没有数字的时候,[0-9]*
可以匹配0次,这将匹配到一个空字符串,在一行中,任何两个字符之间都认为有一个空字符串。
所以替换的结果就是在任何两个字符之间添加一个_
字符。这可能不是我们所希望的,在使用的时候应该多注意星号*
匹配0次的情况。
锚点:$与^
锚点表示要匹配的字符串必须处于的位置。
$在尾部时有特殊意义,否则与其自身匹配
例:123$
匹配文件中行尾的123,不在行尾的123字符不匹配
例:$123
与字符串$123
匹配
例:.$
匹配行尾的任意字符
^在首部时有特殊意义,否则与其自身匹配
例:^printf
匹配行首的printf字符串,不在行首的printf串不匹配
例:Hel^lo
与字符串Hel^lo
匹配
例:在vi中使用 :1,$s/^----//g
表示删除第一行到最后一行的每行行首的4个减号-
1 | 0123456789 |
替换结果:
1 | 0123456789 |
正则表达式扩展
ERE:扩展的正则表达式(ERE)
PCRE: Perl-compatible regular expression
对基本正则表达式(BRE)进行了改进:
- 添加分组:圆括号() :
(xy)*
可匹配空字符串,xy
,xyxy
,xyxyxy
- 添加逻辑运算:表示逻辑“或” 的符号 |
(pink|green)
表示与pink或green匹配
- 复次数定义:与星号地位类似的+和?,限定重复次数 {m,n}
*
号表示它左边的单字符正则表达式重复的0次或多次+
号表示重复1次或多次:[0-9]+
:匹配长度至少为1数字串
?
表示0次或一次:a?
:匹配零个或一个a
- 限定重复次数
\{m,n\}
,例如:[1-9][0-9]\{6,8\}
:7-9位数字,首位非0
- 命名的预定义集合
[[:xdigit:]]
:十六进制数字\d
:数字\D
:非数字
- 比
^
和$
更灵活的锚点定义- 例如:寻找一个数字串,但是要求这个数字串不许出现在“合计”两个字之后