正则表达式基础

前言

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
例如:
• runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前⾯面的字符必须⾄至少出现⼀一次(1次或多次)。
• runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
• colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。

在这里插入图片描述
例如:搜索有the的行,并输出行号

$ grep -n 'the' regular_express.txt

搜索没有the的行,并输出行号

$ grep -nv 'the' regular_express.txt
[]的介绍

       利⽤[]搜索集合字符,[] 表示其中的某⼀个字符

例:[ade] 表示a或d或e

$ grep -n 't[ae]st' regular_express.txt

输出结果:
8:I can’t finish the test.
9:Oh! the soup taste good!

       用^符号做[]内的前缀,表示除[]内的字符之外的字符。
例:
比如搜索oo前没有g的字符串所在的行. 使⽤用 ‘[^g]oo’ 作搜索字符串

$ grep -n '[^g]oo' regular_express.txt

输出:
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!

       [] 内可以⽤用范围表示,如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z]则是大写字母们。[a-zA-Z0-9]表示所有数字与英⽂文字符。 当然也可以配合^来排除字符。
例:搜索包含数字的行

$ grep -n '[0-9]' regular_express.txt

输出:
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.

行首与行尾字符 ^ $

^ 表示行的开头,$表示行的结尾( 不是字符,是位置)这里^与[]里面使用的意义不同。它表示后面的串是在行的开头。

例:搜索the在开头的行

$ grep -n '^the' regular_express.txt

结果:
12:the symbol ‘*’ is represented as star.

例:搜索以小写字母开头的行

$ grep -n '^[a-z]' regular_express.txt

输出结果:
2:apple is my favorite food.
4:this dress doesn’t fit me.

任意一个字符. 与重复字符 *

*表示有0个或多个 某个字符。

例如 oo*, 表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o.

. 代表⼀一个任意字符,必须存在。 g??d 可以⽤用 ‘g…d’ 表示。 good ,gxxd ,gabd ……都符合。

例:前两个o一定存在,第三个o可没有,也可有多个。

$ grep -n 'ooo*' regular_express.txt

输出结果:
1:“Open Source” is a good mechanism.

问:搜索开头不是英文字母的行?

$ grep -n '^[^a-zA-Z]' regular_express.txt

问:$ grep -n '^$' regular_express.txt 表示什么?

       显示空行,因为只有行首和行尾。

       注意,让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。’[+*?.!^ -]’ 表示含有+,*,?,, ., !, ˆ,空格,- 的串,注意[]里面有个小空格。

限定连续重复字符的范围 { }

       . * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 。范围是数字用’,'隔开 {2,5} 表示2~5个,{2}表示2个,{2,} 表示2到更多个.

       注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用\转义一下。

例:搜索g后面跟2~5个o,后面再跟一个g的字符串的行。

$ grep -n 'go\{2,5\}g' regular_express.txt

输出:
18:google is the best tool for searching.
19:goooogle is the best tool for searching.

       当要查找一个含有空格、制表符或双引号的字符串时,必须用单引号将其括起来。而查找包含单引号的字符串时,⽤双引号将字符串括起来,而且在每个单引号前加反斜线’\’.

例:$ grep “I\’m right” stan.memo
问:$ grep -n '\.$' regular_express.txt 表示什什么意思?(.为特殊符号)
       以.结尾的行

忽略大小写,使⽤用-i选项
例: $grep -i ‘phD’ database.memo
找文件中不包含某字符串的行用-v选项,接收正则表达式 grep -E

():对字符串进行分组 - 需要使用转义

():将一个或多个字符捆绑在一起,当作一个整体进行处理;

例:找到abc连续出现至少两次的字符串

$ grep -n ‘\(abc\)\{2,\}’ reg.txt

例:找到连续出现至少两次c?r的字符串, 其中?可以是任何数字

$ grep -n ‘\(c[0-9]r\)\{2,\}’ reg.txt
扩展正则表达式的egrep 与扩展特殊符号 |

       注意grep只支持基础表达式, 而egrep 支持扩展的, 其实egrep 是 grep -E 的别名而已。因此grep -E 支持扩展正则。
例:

$ egrep -v '^$|^#' regular_express.txt

输出:
“Open Source” is a good mechanism to develop programs.
apple is my favorite food.
问:
$ grep -i ‘^\(car\|good\)’ regular_express.txt 表示什么意思?

egrep -i ‘^(car|good)

正则表达式中各运算符的优先级从高到低:(),[],* ? ,\,|(或)

字符说明
^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。匹配输入字符串的开始位置。要匹配 ‘^’ 字符本身,请使用 ‘^’。
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 ‘$’ 字符本身,请使用 ‘$’。
+匹配前面的子表达式一次或多次。要匹配 ‘+’ 字符本身,请使用 ‘+’。
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ‘(’ 和 ‘)’。
\w匹配所有的字母、数字、下划线的字符
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ‘?’ 字符,请使用 ‘?’。

小练习:

例题1

正则表达式-Linux路径:

格式要求:

  1. 必须’/'开头
  2. 字符串只允许字母、数字、下划线
^\/(\w+\/?)+$

解析:

  1. 前后使用了 ‘^’ 和 ‘$’ ,代表这里要校验整个字符串(从字符串开头到结尾)。
  2. 接下来 '/'字符 ,这里用了斜杆转译,代表要以 / 开头。
  3. 使用 '()'将子表达式写在括号内。
  4. 括号内的表达式:’\w+’,匹配出现一个或多个字母、数字、下划线的字符。’/?’,匹配斜杠,可有可无。
  5. 括号外的+号,匹配括号内的规则,一次或者多次。

       将上述分析总结:校验整个字符串 -> 以斜杠开头 + ((一个或多个字符串 + 可有可无的斜杆)* n(大于0)次) 。

例题2

请设计正则表达式,使用egrep命令找出ifconfig结果中所有包含IP地址的行。

       分析:IP地址分为四块,前三块末尾都有’.’,而最后一个没有。故先匹配前三个,再匹配最后一个。匹配时,要注意兼顾所有情况。

ifconfig | egrep -n '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
最后,注大家码运隆昌!

如有错误,请予指正

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值