基础的正则表达式
1、“.”符号
点符号用于匹配除换行符之外的任意一个字符。例如:r.t
可以匹配rot、rut
,但是不能匹配root
,如果使用r..t
就可以匹配root、ruut、r t
(中间是两个空格)等。
2、“*”符号
“ * ”
符号用于匹配前一个字符0次或任意多次,比如ab*
,可以匹配a、ab、abb
等。“ * ”
号经常和“.”
符号加在一起使用。比如“.*”
代表任意长度的不包含换行的字符。
3、“{n,m}”符号
使用“\{n,m\}”
符号可以灵活的控制字符的重复次数,典型的有以下3种形式:
\{n\}
匹配前面的字符n次:grep "ro\{2\}t" /etc/passwd(r和t中包含两个o)
\{n,\}
匹配前面的字符至少n次以上(含n次)
\{n,m\}
匹配前面的字符n到m次。
4."^"符号
用于匹配开头的字符。
5、“$”符号
用于匹配结尾的字符。
“^$” 代表空行
以r开头,中间有一串任意字符,以h结尾的行
6、“[]”符号
一对方括号,用于匹配方括号内出现的任一字符。
[ABCD] 就是A、B、C、D中的任意一个
[A-Z] 匹配任意一个大写字母
[A-Za-z] 匹配任意一个字母
[^A-Z] 代表不是大写字母 “^”符号在[]里面就是取反
匹配手机号。手机号是11位连续的数字,第一位一定是1,所以表示为“^1”;第二位有可能是3(移动)或8(联通),表示为“[38]”;后面连续9个任意数字,表示为“[0-9]\{9\}”
所以整个表达式为:“^1[38][0-9]\{9\}”
7、“\”符号
转义符号
例如:021-88888888 和021 88888888 两种不同的电话号码写法,如何匹配呢?
[ -]是错误的[\ \-]是对的 \对空格和-进行了转义
如何匹配任意长度的点号呢? “\.*”
如果要对“\”符号进行转义,就可以写成:“\\”
8、“\<”符号和“\>”符号
这两个符号分别用于界定单词的左边界和右边界。
“\<hello”用于匹配以“hello”开头的单词
“hello\>”则用于匹配以“hello”结尾的单词
“\<\>”用于精确匹配一个字符串。
“\<hello\>”精确匹配单词hello,而不是helloworld等
9、“\b”符号
匹配单词的边界,比如“\bhello\b”
可以精确匹配“hello”单词
10、“\B”符号
匹配非单词的边界,比如hello\B
可以匹配“helloworld”中的"hello"。
11、“\w”符号
匹配字母、数字和下划线,等价于[A-Za-z0-9]
12、“\W”符号
匹配非字母、非数字、非下划线,等价于[^A-Za-z0-9]
13、“\n”符号
匹配一个换行符
14、“\r”符号
匹配一个回车符
15、“\t”符号
匹配一个制表符
16、“\f”符号
匹配一个换页符
17、“\s”符号
匹配任何空白字符
18、“\S”符号
匹配任何非空白字符
扩展的正则表达式
在基础正则表达式上做了一些补充。注意,在使用这些扩展符号时,需要使用egrep
命令
1、“?”符号
用于匹配前一个字符0次或1次,所以"ro?t"
仅可以匹配rot、rt
。
2、“+”符号
用于匹配前一个字符1次以上,所以“ro+t”
可以匹配rot、root
等。
3、“|”符号
“|”
符号是“或”
的意思,即多种可能的罗列,彼此间是一种分支关系。
比如
区号是3位的固定电话的正则表达式方式
^0[0-9]\{2\}-[0-9]\{8\}
区号是4位的固定电话的正则表达式方式
^0[0-9]\{3\}-[0-9]\{8\}
两种区号的固定电话号码可以这样写:
^0[0-9]\{2,3\}-[0-9]\{8\}
使用“|”符号也可以,但是 显然比上面的方式麻烦
^0[0-9]\{2\}-[0-9]\{8\}|^0[0-9]\{3\}-[0-9]\{8\}
4、“()”符号
“()”
符号通常需要和“|”
符号联合使用,用于枚举一系列可替换的字符。
使用“()”和“|”匹配hard、hold或hood
h(ar|ol|oo)d
通配符
通配符和正则表达式之间存在一些差异,通配符主要用在文件名的匹配上,正则表达式主要使用在对文件内容的匹配上。
1、“*”符号
代表0个或多个字符
列出当前目录下以“.txt”结尾的文件
2、“?”符号
代表任意一个字符
3、“{}”符号
匹配所有括号内包含的以逗号隔开的字符
4、“^”符号和“!”符号
这两个符号往往和“[]”
一起使用,当出现在“[]”
中的时候,代表取反。所以[^A]
或[!A]
都代表不是A