zl程序教程

您现在的位置是:首页 >  前端

当前栏目

三剑客修炼小抄(二): grep 正则表达式从崩溃到入门

正则表达式入门 崩溃 修炼 grep 三剑客
2023-09-14 09:15:28 时间

三剑客修炼小抄

grep 、sed、awk 被称为 linux 中的”三剑客”

  • grep 更适合单纯的查找或匹配文本
  • sed 更适合编辑匹配到的文本
  • awk 更适合格式化文本,对文本进行较复杂格式处理

小抄来源朱双印个人日志:https://www.zsythink.net/,感谢大佬带来的这么优秀的技术文章

啥子是正则

我在桌面上新建了一个文件,可以搜索出来自己想要的东西:

  • 会一个个去匹配
  • 有多少个mysql,就能匹配到多少次,我就能回车查看多少次

在这里插入图片描述

如果我要查询以mysql开头的记录,我应该怎么搞呢?这个时候我们就要用到正则表达式了:

在这里插入图片描述

在这里插入图片描述

百度百科定义:

正则表达式,又称 规则表达式。

正则表达式的英语原文为:Regular Expression,常简写为regex、regexp或RE,正则表达式是计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

锚定”行首”与”行尾”

grep 进行一个正则的切入点

准备这个文件:

hello world
hi      hello
hello ,zsy
  • 请看下边:每行都有“hello”,所以都被匹配出来了

在这里插入图片描述

  • 要打印以“hello”开头的咋个整:来一个正则就行了

在这里插入图片描述

  • 要打印“world”结尾的呢:

在这里插入图片描述

  • “^”在正则中表示锚定行首

  • “$”在正则中表示锚定行尾

  • 试试看结合:新增一行内容:hello

在这里插入图片描述

  • ”^$”表示行首与行尾相连,换句话说,就是”空行”:新增一个空行试试

在这里插入图片描述

锚定”词首”或”词尾”

正则表达式中,”\<“表示锚定词首,”\>”表示锚定词尾

  • 锚定词首:很简单撒,单词开头的

在这里插入图片描述

  • 锚定词尾:

在这里插入图片描述

  • 一起使用试试:其实就是匹配了一个独立的单词

在这里插入图片描述

  • 还可以使用”\b”去代替”\<“和”\>”,”\b”既能锚定词首,也能锚定词尾:

在这里插入图片描述

  • “\B”是用来匹配”非单词边界”的,与“\b” 不一样:以下比方意思就是只要开头不是hello,都会被匹配到

在这里插入图片描述

^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。

$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。

^$:表示匹配空行,这里所描述的空行表示”回车”,而”空格”或”tab”等都不能算作此处所描述的空行。

^abc$:表示abc独占一行时,会被匹配到。

\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。

\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。

\B:匹配非单词边界,与\b正好相反。

连续次数的匹配

准备的文件内容:

[root@whale scripts]# cat regex
a a a
aaaa aaaaaaa
aaaaaaa  aaaaa
bb bbcc da d
ef edf ecf
aaa aa aaaa
a
[root@whale scripts]#

按照我们所知道,要匹配上述内容的连续几个a应该怎么匹配法呢:显示我们一点不专业

在这里插入图片描述

那就来一个专业的吧:”\{2\}”就表示”连续出现2次”

在这里插入图片描述

  • “\{x,y\}”表示之前的字符至少连续出现x次,最多连续出现y次,:请看下边

在这里插入图片描述

  • \{x,\}表示之前的字符至少连续出现x次,或者连续出现次数大于x次,即可被匹配到,上不封顶。

  • \{,y\}表示之前的字符至多连续出现y次,或者连续出现次数小于y次,即可被匹配到,最小次数为0次

在这里插入图片描述

常用字符

.

正则表达式中,“.”匹配任意单个字符(除了换行符外):

匹配特殊字符

我们进一步可以对任意字符进行限制:修改一下我们的文件内容,这样好操作一些:

[root@whale scripts]# cat regex
ef edf ecf
avdsfjkDAHKASHD3214
AAabcd3242cd
dad234 aa3234
aaADC234
AAaa4423
bcdaa
[root@whale scripts]#

比如:我们现在不匹配任意字符,要匹配后面必须是字母:[[:alpha:]] 表示”任意字母”(不区分大小写)

  • 请看下边的一个正则组合:a后面跟着3或4个字母;我好像悟了

在这里插入图片描述

  • 继续来:[[:lower:]]表示“任意小写字母”

在这里插入图片描述

  • 继续:任意大写字母

在这里插入图片描述

还有很多:

[[:alpha:]] 表示任意大小写字母 等价于:[a-zA-Z]

[[:lower:]] 表示任意小写字母

[[:upper:]] 表示任意大写字母

[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)等价于:[0-9]

[[:alnum:]] 表示任意数字或字母

[[:space:]] 表示任意空白字符,包括”空格”、”tab键”等。

[[:punct:]] 表示任意标点符号

[]的特殊含义

从上述的规则中我们发现了特殊一个东西:[]

“[ ]”表示匹配指定范围内的任意单个字符,不理解就看下边:

  • 请看这个:意思就是匹配aA\bA\cA\dA其中的一种

在这里插入图片描述

演变出来的还有:[^]:表示匹配指定范围外的任意单个字符

  • 看一下:大师,我悟了

在这里插入图片描述

所以上述的[]符号都可以加^表示另一层意思了:

[^a-z]表示非小写字母的单个字符可以被匹配到。

[^A-Z]表示非大写字母的单个字符可以被匹配到。

[^a-zA-Z]表示非字母的单个字符可以被匹配到,比如数字或符号。

[^a-zA-Z0-9]表示非字母、非数字的单个字符可以被匹配到,比如符号。

[^0-9]与[^[:digit:]]等效

[^a-z]与[^[:lower:]]等效

[^A-Z]与[^[:upper:]]等效

[^a-zA-Z]与[^[:alpha:]]等效

[^a-zA-Z0-9]与[^[:alnum:]]等效

还有一些简写格式,我不想悟了:

\d 表示任意单个0到9的数字

\D 表示任意单个非数字字符

\t 表示匹配单个横向制表符(相当于一个tab键)

\s表示匹配单个空白字符,包括”空格”,”tab制表符”等。

\S表示匹配单个非空白字符。

分组和后向引用

分组

请看这个比方:这个意思是要匹配o两次,但是这个针对的是单个字符,如果我要匹配两次hello呢?

在这里插入图片描述

所以有个分组:很明显\( \)就表示分组。

在这里插入图片描述

分组嵌套

再准备一个文本内容:

[root@whale scripts]# cat regex
abefef
abefefabefef
[root@whale scripts]#
  • 这下面是个啥?
    • 2次连续出现的abefef被匹配到,悟到了么?

在这里插入图片描述

后向引用

后向引用是在分组的前提下才有的

重新准备一个文本内容:

[root@whale scripts]# cat regex
Hello world Hello
Hiiii world Hiiii
[root@whale scripts]#
  • 我们要匹配上述两行文字:这个还是会

在这里插入图片描述

  • 再改一下文本内容后新增一个要求:world 前后的单词要一样
    • 显然上述的操作就不符合了
    • 第二个比方就可以了:在原来的基础上添加了分组
    • “\1″表示整个正则中第1个分组中的正则所匹配到的结果

在这里插入图片描述

在这里插入图片描述

上大佬的图:

在这里插入图片描述

这就是”后向引用“

如果是嵌套分组,根据分组符号的左侧部分排序,进行\1 \2 \3的排序

转义符

准备一个文件内容:

[root@whale scripts]# cat regex
bae
a1#
ddd
a-!
ccc
a..
[root@whale scripts]#
  • 匹配一个:

  • 我现在要匹配的内容:a开头后面跟着两个.的

    这个时候就用到了反斜杠\:“\”与正则中的符号结合在一起时,就表示这个符号本身的含义

在这里插入图片描述

  • 再看几个:

在这里插入图片描述

  • 那匹配问好?加号也需要加么?肯定不需要了撒,直接匹配即可
  • 如果匹配反斜杠本身,前面再加一个反斜杠就行了

扩展正则表达式

以下内容在扩展正则也是通用的:

.   表示任意单个字符。
*  表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\  表示转义符,当与正则表达式中的符号结合时表示符号本身。
[  ]表示匹配指定范围内的任意单个字符。
[^  ]表示匹配指定范围外的任意单个字符。
 
[[:alpha:]]  表示任意大小写字母。
[[:lower:]]  表示任意小写字母。
[[:upper:]]  表示任意大写字母。
[[:digit:]]  表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]]  表示任意数字或字母。
[[:space:]]  表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]]  表示任意标点符号。
[^[:alpha:]]  表示单个非字母字符。
[^[:lower:]]  表示单个非小写字母字符。
[^[:upper:]]  表示单个非大写字母字符。
[^[:digit:]]  表示单个非数字字符。
[^[:alnum:]]  表示单个非数字非字母字符。
[^[:space:]]  表示单个非空白字符。
[^[:punct:]]  表示单个非标点符号字符。
[0-9]与[[:digit:]]等效。
[a-z]与[[:lower:]]等效。
[A-Z]与[[:upper:]]等效。
[a-zA-Z]与[[:alpha:]]等效。
[a-zA-Z0-9]与[[:alnum:]]等效。
[^0-9]与[^[:digit:]]等效。
[^a-z]与[^[:lower:]]等效。
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效
 
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。

grep 使用扩展正则方式:-E 选项即可

区别:

在基本正则表达式中,\{n\} 表示前面的字符连续出现n次,将会被匹配到。

在扩展正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在基本正则表达式中,\( \) 表示分组,\(ab\) 表示将ab当做一个整体去处理。

在扩展正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。
( ) 表示分组
(ab) 表示将ab当做一个整体去处理。
\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。
\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。
?  表示匹配其前面的字符0或1次
+  表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
{n} 表示前面的字符连续出现n次,将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。
{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
{n,}表示之前的字符连续出现至少n次,才会被匹配到。

扩展正则中常用的符号:“|”

“|”在扩展正则表达式中,表示”或”

  • 请看这个比方就知道了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jT8j6ebg-1675045321647)(../gallery/image-20220723142137134.png)]