正则表达式

基础正则表达式

概述

1.正则表达式Regular Expression [ˈreɡjələr ɪkˈspreʃn] 就是能用某种模式去匹配一类字符串的公式,它是由一串字符和元字符构成的字符串。
2.元字符,就是用以阐述字符表达式的内容、转换和描述各种操作信息的字符。
3.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单的说,正则表示式就是处理字符串的方法。
4.正则表达式以行为单位来进行字符串的处理行为,通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/替换某特定字符串的处理程序。

基础的正则表达式

# 1. “.” (一个点)符号 点符号用于匹配除换行符之外的任意一个字符。
grep "r..t" /etc/passwd

# 2. “*” 符号用于匹配前一个字符0次或任意多次比如ab*,可以匹配a、ab、abb等。
# “*”号经常和“.”符号加在一起使用。比如“.*”代表任意长度的不包含换行的字符。
grep "r*t" /etc/passwd

# 3. “\{n,m\}” 符号可以灵活的控制字符的重复次数,典型的有以下3种形式:

# \{n\} 匹配前面的字符n次。
grep "ro\{2\}t" /etc/passwd

# \{n,\} 匹配前面的字符至少n次以上(含n次)
grep "ro\{2,\}t" /etc/passwd

# \{n,m\} 匹配前面的字符n到m次
grep "ro\{2,3\}t" /etc/passwd

# 4. "^" 符号用于匹配开头的字符
grep "^root" /etc/passwd

# 5. “$” 符号用于匹配结尾的字符 例:“abc$”代表以abc结尾  “^$” 代表空行
grep 'nologin$' /etc/passwd
grep '^r.*n$' /etc/passwd

# 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\}”
# 如果想防止之后还有字符可以使用$结束:'^1[38][0-9]\{9\}$'

# 准备一个文件
vim test
写入以下内容
13865458524
18365458524
15165458524
13665458524
dfsffdgffdv
fdfdfdfdffdfdfdfd
138654585241386545852413865458524
021-8888888
021 88888888

grep '^1[38][0-9]\{9\}$' test

# 7. “\”符号 转义符号
grep '^[0-9]\{3,4\}[\ \-][0-9]\{7,8\}$' test

# 8. “\<” 符号和 “\>” 符号 这两个符号分别用于界定单词的左边界和右边界。
# “\<hello”用于匹配以“hello”开头的单词
# “hello\>”则用于匹配以“hello”结尾的单词
# “\<\>”用于精确匹配一个字符串。
# “\<hello\>”精确匹配单词hello,而不是helloworld等
echo 'helloworld' | grep '\<hello'
echo 'hello' | grep '\<hello\>'
echo 'helloworld' | grep '\<hello\>'

# 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命令。

扩展符号

  • “?” 符号

    用于匹配前一个字符0次或1次,所以"ro?t" 仅可以匹配rot、rt。

  • “+” 符号

    用于匹配前一个字符1次以上,所以“ro+t”可以匹配rot、root等。

  • “|” 符号

    “|”符号是“或”的意思,即多种可能的罗列,彼此间是一种分支关系。

  • “()” 符号

    “()”符号通常需要和“|”符号联合使用,用于枚举一系列可替换的字符。例如:h(ar|ol|oo)d 匹配hard、hold或hood

通配符

通配符和正则表达式之间存在一些差异,通配符主要用在文件名的匹配上,正则表达式主要使用在对文件内容的匹配上。

  • "*" 符号

    代表0个或多个字符。

    ls -l /etc/*.conf

  • "?" 符号

    代表任意一个字符。

    ls -l /etc/???.conf

  • "{}" 符号

    匹配所有括号内包含的以逗号隔开的字符

    ls -l /etc/{yum,ntp}.conf

  • "^" 符号和 “!” 符号

    这两个符号往往和“[]”一起使用,当出现在“[]”中的时候,代表取反。所以[^A]或[!A]都代表不是A

特殊的POSIX字符

  • POSIX(Portable[ˈpɔːrtəbl]便携式 Operating [ˈɑːpəreɪtɪŋ]操作 System Interface 可移植操作系统接口) 特殊的字符类,grep支持POSIX字符类。

  • grep支持一类特殊的POSIX字符,列举如下:

    • [:alnum:] 文字数字字符
    • [:alpha:] 文字字符
    • [:digit:] 数字字符
    • [:graph:] 非空字符(非空格、控制字符)
    • [:lower:] 小写字符
    • [:upper:] 大写字符
    • [:cntrl:] 控制字符
    • [:print:] 非空字符(包括空格)
    • [:punct:] 标点符号
    • [:space:] 所有空白字符(新行,空格,制表符)
    • [:xdigit:] 十六进制数字(0-9,a-f,A-F)

demo

# 正则表达式和grep结合后会产生强大的搜索功能,由于正则表达式中含有较多特殊的字符,所以结合grep时,最好使用单引号将正则表达式括起来,以免造成错误。
# 创建文件
vim RegExp.txt
# 写入以下内容
good morning teacher
hello world is a script
gold sunshine looks beautiful
golden time flies
god bless me

what a delicious food
they teast Good
you fell glad

wrong word gooood
wrong word gl0d
wrong word gl2d
wrong word gl3d

www.helloworld.com
www@helloworld@com
Upper case
100% means pure
php have a gd module

# 搜索含有good单词的行,grep默认是区分大小写的
grep 'good' RegExp.txt

# 搜索含有good单词的行,不区分大小写
grep -i 'good' RegExp.txt

# 搜索以good开头的行
grep '^good' RegExp.txt

# 搜索以Good结尾的行
grep 'Good$' RegExp.txt

# 统计文件中共有多少行空行
grep -c '^$' RegExp.txt

# 搜索包含good和Good的行
grep '[gG]ood' RegExp.txt

# 搜索一个包含ood的行,但是不能是Good或good
grep '[^Gg]ood' RegExp.txt

# 搜索包含一个词,该词以g开头、紧跟着是两个任意字符、再接着是一个d的行
grep 'g..d' RegExp.txt

# 搜索包含一个词,该词以g或G开头、紧跟着是两个任意字符、再接着是一个d的行
grep '[Gg]..d' RegExp.txt

# 搜索这样一些行,该行包含某个单词,该词满足如下条件:
# 1、第一个字符可以是G或g
# 2、第二个字符可以是1或o
# 3、第三个字符可以是换行符之外的任意字符
# 4、第四个字符一定是d
grep '[Gg][1o].d' RegExp.txt

# 搜索精确匹配含有gold这个单词的行
grep '\<gold\>' RegExp.txt
grep '\bgold\b' RegExp.txt
egrep '\bgold\b' RegExp.txt

# 搜索这样一些行,该行包含某个单词,该词满足如下条件:
# 1、以g开头
# 2、g后面一定有字符
# 3、最后是d
grep 'g..*d' RegExp.txt

# 文件中有一些拼写错误的单词,发现把glod中的o写成数字了,如何找出?
grep 'gl[0-9]d' RegExp.txt

# 搜索文件中包含域名www.helloworld.com的行
grep 'www.helloworld.com' RegExp.txt

# 搜索以字母g开头包含两个以上o的单词
grep 'go\{2,\}' RegExp.txt

# 搜索以字母g开头,中间正好包含4个o的单词
grep 'go\{4\}' RegExp.txt


# 使用特殊的POSIX字符

# 搜索以大写字母开头的行:
grep ^[[:upper:]] RegExp.txt

# 搜索以数字开头的行:
grep ^[[:digit:]] RegExp.txt


# 使用扩展的正则表达式

# 搜索g和d之间至少有一个o的行
egrep 'go+d' RegExp.txt

# 搜索g和d之间只有0个或1个o的行(0次或1次)
egrep 'go?d' RegExp.txt

# 搜索有glad或gold的行
egrep 'g(la|ol)d' RegExp.txt
egrep 'glad|gold' RegExp.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值