目录
一,什么是正则表达式
二,为什么使用正则表达式
三,如何使用正则表达式
示例:
四,基本正则表达式
基本正则表达式示例:
正则表达式字符集示例:
五,扩展正则表达式
扩展正则表达式示例:
扩展:
正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。
在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。
当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确 与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户 可以使用grep命令来测试。
grep家族有三大成员分别为:
grep:支持使用基本正则表达式。
egrep:支持使用扩展正则表达式。
fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面 意义,不再拥有特殊意义。
grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。grep命令 使用正则表达式来搜索文本,并且把匹配的文本行打印出来。
grep命令根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的 行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
grep命令的基本语法如下:grep [options] pattern [file…]
在上面的语法中,options表示选项,选项列表如下表。pattern表示要匹配的模式,file表示一系列的文 件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后面的所有的字符串参数都被看作是文件名。
1, -n : 显示行号
[root@wangjingjing ~]# ls -l | grep -n num
21:-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
2, -o : 只显示匹配的内容
[root@wangjingjing ~]# ls -l | grep -o num
num
3, -q : 静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
[root@wangjingjing ~]# ls -l | grep -q num
[root@wangjingjing ~]# echo $?
0
4, -A : 如果匹配成功,则将匹配行及其后n行一起打印出来
[root@wangjingjing ~]# ls -l | grep num -A 2
-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Pictures
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Public
5, -B : 如果匹配成功,则将匹配行及其前n行一起打印出来
[root@wangjingjing ~]# ls -l | grep num -B 2
-rw-r--r--. 1 root root 0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root 171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
6, -C : 如果匹配成功,则将匹配行及其前后n行一起打印出来
[root@wangjingjing ~]# ls -l | grep num -C 2
-rw-r--r--. 1 root root 0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root 171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Pictures
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Public
7, -c :如果匹配成功,则将匹配到的行数打印出来 (统计行数)
[root@wangjingjing ~]# ls -l | grep -c num
1
--color: 高亮颜色显示匹配到的字符串
--color=never没有颜色
--color=always
--color=auto自动的颜色
-E: 支持扩展中的表达式
-e:支持基本的正则表达式
-P: 对Perl的正则表达式的支持
8, -o:只输出匹配到的内容
[root@wangjingjing ~]# ls -l | grep function
-rw-r--r--. 1 root root 682 Feb 3 12:07 function_script.sh
[root@wangjingjing ~]# ls -l | grep -o function
function
9, -v :取反,不匹配
[root@wangjingjing ~]# ls -l | grep -v function
total 72
-rw-r--r--. 1 root root 331 Feb 1 20:22 99table_script.sh
-rw-------. 1 root root 1272 Dec 31 19:14 anaconda-ks.cfg
-rw-r--r--. 1 root root 215 Jan 31 15:27 arg_script.sh
-rw-r--r--. 1 root root 332 Jan 31 15:28 args_script.sh
drwxr-xr-x. 2 root root 36 Jan 1 11:00 at230101
drwxr-xr-x. 2 root root 116 Jan 8 18:15 ca_learning
10, -w:匹配单词
[root@wangjingjing 0202]# grep -w hello file.txt
hello
hello world
基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达 式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之 一,另外一种语法标准称为扩展正则表达式。
1, ^ 在每行的开始进行匹配
匹配以123为开头的
[root@wangjingjing ~]# echo "123 456 789" | grep ^123
123 456 789
[root@wangjingjing ~]# echo "123 456 789" | grep ^456
[root@wangjingjing ~]#
2, $ 在每行的末尾进行匹配
匹配以789结尾的
[root@wangjingjing ~]# echo "123 456 789" | grep 789$
123 456 789
[root@wangjingjing ~]# echo "123 456 789" | grep 456$
[root@wangjingjing ~]#
3, . 对任何单个字符进行匹配
匹配ab后面连着任意一个字符
[root@wangjingjing 0202]# echo "abcdabef" | grep ab.
abcdabef
匹配ab后面连着任意2个字符
[root@wangjingjing ~]# echo "abcdabcdabcd" | grep a..
abcdabcdabcd
4, *(量词) 对前一项进行0次或多次重复匹配
尽可能多的去匹配(成功的前提下)
多次a
[root@wangjingjing ~]# echo "aaabbbccc" | grep "a*"
Aaabbbccc
0次a
[root@wangjingjing ~]# echo "bbbccc" | grep "a*"
bbbccc
5, [str] 对str中的任何单个字符进行匹配
6, [a-b] 对a到b之间的任何字符进行匹配
[root@wangjingjing ~]# echo "a" | grep [a-z]
a
[root@wangjingjing ~]# echo "7" | grep [0-9]
7
[root@wangjingjing ~]# echo "m" | grep [a-z]
m
7, [^str] 对任何不在str中的单个字符进行匹配
匹配,abc的补集
[root@wangjingjing 0202]# echo "a" | grep [^abc]
[root@wangjingjing 0202]# echo "m" | grep [^abc]
m
8, \ 忽略后面一个字符的特殊含义
取消.的特殊意义
[root@wangjingjing ~]# echo "3a14" | grep "^3.14"
3a14
[root@wangjingjing ~]# echo "3a14" | grep "^3\.14"
[root@wangjingjing ~]#
注意:grep要将{}转义,\{\},egrep不需要转义
9, a{n}: a重复指定的次数
[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{5\}'
aaaaaaaa
[root@wangjingjing 0202]# echo "aaaaaaaa" | egrep 'a{5}'
aaaaaaaa
10, a{n,m}: 重复n-m次(贪婪的)
对a第一次匹配(重复)5次,第二次匹配三次
[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{2,5\}'
aaaaaaaa
11, a{n,}: 最少重复n次,最多没有限制
贪婪的,重复最多次
[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{2,\}'
aaaaa
12, a{,m}:最多重复m次,最少没有限制
[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{,2\}'
aaaaa
13, \(\),定义子表达式的开始和结束位置。
匹配abcd
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)'
abcdefbcdcdd
匹配abcdef,组1
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1'
abcdefbcdcdd
匹配abcdefbcd(组1)cd(组2)
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1\2'
abcdefbcdcdd
14, \或\b:锚定词尾(支持vi和grep),其前面的任意字符必须作为单词尾部出现,
只匹配单词的首尾,不包括特殊符号,除了. ?
[root@wangjingjing 0202]# echo "hello" | grep '\bhello\b'
hello
[root@wangjingjing 0202]# echo "helloo" | grep '\bhello.\b'
helloo
贪婪:尽可能多的去匹配(大前提:匹配成功)
a*: 0-任意多
a?:0-1
a+:1-任意
a{n,m}: n-m
正则表达式字符集
1, [[:alnum:]] 匹配任意一个字母或者数字,等价于[A-Za-z0-9]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:alnum:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z0-9]*'
hello123
2, [[:alpha:]] 匹配任意一个字母,等价于[A-Za-z]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:alpha:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z]*'
hello123
3, [[:digit:]] 匹配任意一个数字,等价于[0-9]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:digit:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[0-9]]*'
hello123
4, [[:lower:]] 匹配任意一个小写字母,等价于[a-z]
[root@wangjingjing 0202]# echo "Hello123" | grep '[[:lower:]]*'
Hello123
[root@wangjingjing 0202]# echo "Hello123" | grep '[a-z]*'
Hello123
5, [[:upper:]] 匹配任意一个大写字母,等价于[A-Z]
[root@wangjingjing 0202]# echo "Hello123" | grep '[[:upper:]]*'
Hello123
[root@wangjingjing 0202]# echo "Hello123" | grep '[A-Z]*'
Hello123
6, [[:space:]] 匹配任意一个空白符,包括空格、制表符、换行符以及分页符
空格
[root@wangjingjing 0202]# echo "Hello 123" | grep '[[:space:]]*'
Hello 123
制表符(占8位)
[root@wangjingjing 0202]# echo -e "Hello\t\t\t123" | grep '[[:space:]]*'
Hello 123
换行符(grep -z 选线)
[root@wangjingjing 0202]# echo -e "Hello\n\n123" | grep -z '[[:space:]]*'
Hello
123
扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、 “[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
1,+ 对前一项进行1次或多次重复匹配
[root@wangjingjing 0202]# echo "sssssss" | grep -E 's+'
sssssss
2, ? 对前一项进行0次或1次重复匹配
[root@wangjingjing 0202]# echo "sssssss" | grep -E 's?'
sssssss
3, 匹配单独的a
[root@wangjingjing 0202]# echo "sssssss" | grep -E 's*?'
sssssss
非贪婪:尽可能少的去匹配
a*?
a+?
a??
a{n,m}?
1, (?:):分组的非捕获版本
加了?:的不参与分组
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?:b(c(d)))efg\1'
加了?:的不参与分组,组名顺延
[root@wangjingjing 0202]# echo "abcdefgcd" | grep -Po 'a(?:b(c(d)))efg\1'
abcdefgcd
2, 给分组命名 ?p<组名> (?p=组名)
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?P
b(c(d)))efg(?P=g1)' abcdefgbcd
3, ?#注释,里面的内容不参与匹配
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?#express)(b(c(d)))efg\1'
abcdefgbcd
4,(?=): 不消耗样式 lookahead assertion: 前视断言:他是一个判定条件,但是不作为结果范围,也不消耗内容
去匹配,要获取的是windows,但是只能是windows10的时候获取windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)"
windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)10"
windows10
[root@wangjingjing 0202]# echo "windows98" | grep -Po "windows(?=10)"
[root@wangjingjing 0202]#
5, (?!…): negative lookahead assertion: 前视预断言取反
去匹配,要获取的是windows,但是只能不是windows10的时候获取windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po 'windows(?!10)'
[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)'
windows
[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)98'
windows98
6, (?<=…): positive lookbehind assertion: 后视断言
只有windows前边是10的时候,才匹配成功,也是返回windows
ot@wangjingjing 0202]# echo "10windows" | grep -Po '(?<=10)windows'
windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<=10)windows'
10windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '98(?<=10)windows'
[root@wangjingjing 0202]#
7, (?<!…): positive lookbehind assertion: 后视断言取反
只有windows前边不是10的时候,才匹配成功,也是返回windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '(?
[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?
[root@wangjingjing 0202]# echo "98windows" | grep -Po '(?
windows
[root@wangjingjing 0202]# echo "98windows" | grep -Po '98(?
98windows
8, A|B: 匹配A或者B:A和B都是正则表达式
[root@wangjingjing 0202]# egrep "^h|o$" file.txt
hello
hi
hello world
上一篇:正则表达式——URL验证