^ 行首定位符 $ 行尾定位符 . 匹配除换行符之外的单个字符 * 匹配 0 个或多个前一字符 ? 匹配 0 个或1个前一字符 + 匹配 1 个或多个前一个字符 [ ] 匹配指定字符组内的任一字符 [^] 匹配不在指定字符组内的任一字符 \< 单词起始边界匹配符 \> 单词结束边界匹配符 x\{m\} 连续 M 个字符 X x\{m,\} 至少 M 个字符 X x\{m,n\}至少 M 个最多 N 个字符 X
课堂练习
写一个测试脚本re.sh;带位置参数执行,例如 re.sh ab
代表以a开头的
#!/bin/bash if [[ $1 =~ ^a ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh a ok [root@rhel6 ~]# bash re.sh b no [root@rhel6 ~]# bash re.sh ab ok
代表以a结尾的
#!/bin/bash if [[ $1 =~ a$ ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# vim re.sh [root@rhel6 ~]# bash re.sh a ok [root@rhel6 ~]# bash re.sh b no [root@rhel6 ~]# bash re.sh ab no [root@rhel6 ~]# bash re.sh ba ok
代表a字符后面一定有两个字符
#!/bin/bash if [[ $1 =~ a.. ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# vim re.sh [root@rhel6 ~]# bash re.sh a no [root@rhel6 ~]# bash re.sh axx ok [root@rhel6 ~]# bash re.sh baxx ok [root@rhel6 ~]# bash re.sh baxxx ok
代表匹配a字符后面可以是0个b,也可以是多个b
#!/bin/bash if [[ $1 =~ ab* ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh a ok [root@rhel6 ~]# bash re.sh ab ok [root@rhel6 ~]# bash re.sh abbbb ok [root@rhel6 ~]# bash re.sh abbbbxxx ok [root@rhel6 ~]# bash re.sh accc ok [root@rhel6 ~]# bash re.sh ccc no
匹配 0 个或1个前一字符
#!/bin/bash if [[ $1 =~ 1a?1 ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh 11 ok [root@rhel6 ~]# bash re.sh 1a1 ok [root@rhel6 ~]# bash re.sh 1aa1 no
代表匹配a字符后面可以是1个b,也可以是多个b
#!/bin/bash if [[ $1 =~ ab+ ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh a no [root@rhel6 ~]# bash re.sh ab ok [root@rhel6 ~]# bash re.sh abbb ok [root@rhel6 ~]# bash re.sh ac no
代表匹配ab字符,后面可以是任意字符
#!/bin/bash if [[ $1 =~ ab.* ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# vim re.sh [root@rhel6 ~]# bash re.sh a no [root@rhel6 ~]# bash re.sh ab ok [root@rhel6 ~]# bash re.sh abbbb ok [root@rhel6 ~]# bash re.sh accc no [root@rhel6 ~]# bash re.sh ccc no
代表匹配a和b字符之间可以是任意字符
#!/bin/bash if [[ $1 =~ a.*b ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh a no [root@rhel6 ~]# bash re.sh b no [root@rhel6 ~]# bash re.sh ab ok [root@rhel6 ~]# bash re.sh a1b ok [root@rhel6 ~]# bash re.sh 1a1b1 ok
代表匹配指定字符组内的任一字符,可以用逗号分割,或者不用,效果一样都代表匹配一个字符
#!/bin/bash if [[ $1 =~ [Bb]ooboo ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh booboo ok [root@rhel6 ~]# bash re.sh Booboo ok [root@rhel6 ~]# bash re.sh cooboo no
代表匹配不在指定字符组内的任一字符
#!/bin/bash if [[ $1 =~ [^Bb]ooboo ]] then echo ok else echo no fi
测试:
[root@rhel6 ~]# bash re.sh booboo no [root@rhel6 ~]# bash re.sh Booboo no [root@rhel6 ~]# bash re.sh cooboo ok
单词起始和结束边界匹配符与行首行尾的匹配对比
[root@rhel6 ~]# vim re.file booboo tom jack jack tom booboo tom tom tom jack jack jack
[root@rhel6 ~]# grep "^booboo" re.file booboo tom jack [root@rhel6 ~]# grep "\<booboo" re.file booboo tom jack jack tom booboo [root@rhel6 ~]# grep "\>booboo" re.file [root@rhel6 ~]# grep "\>jack" re.file [root@rhel6 ~]# grep "jack$" re.file booboo tom jack jack jack jack [root@rhel6 ~]# grep "jack\>" re.file booboo tom jack jack tom booboo jack jack jack
某个字符数量限定
x{m}连续 M 个字符 X x{3} =3
x{m,} 至少 M 个字符 Xx{3,} >=3
x{m,n} 至少 M 个最多 N 个字符 X x{3,4} >=3 <=4
[root@rhel6 ~]# vim re.file booboo tom jack jack tom booboo tom tom tom jack jack jack f fo foo fooo foooo
[root@rhel6 ~]# grep "o\{0\}" re.file booboo tom jack jack tom booboo tom tom tom jack jack jack booo boo f fo foo fooo foooo [root@rhel6 ~]# grep "o\{1\}" re.file booboo tom jack jack tom booboo tom tom tom booo boo f fo foo fooo foooo [root@rhel6 ~]# grep "o\{4\}" re.file f fo foo fooo foooo #!/bin/bash if [[ $1 =~ o{2,3}$ ]] then echo ok else echo no fi
[root@rhel6 ~]# bash re.sh foo ok [root@rhel6 ~]# bash re.sh fooo ok [root@rhel6 ~]# bash re.sh fooof no [root@rhel6 ~]# bash re.sh foof no
#!/bin/bash #if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] if [[ $1 =~ ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[1-9]|3[01])$ ]] then echo ok else echo no fi