美文网首页
三、 正则表达式

三、 正则表达式

作者: 胖虎喜欢小红 | 来源:发表于2019-12-18 19:22 被阅读0次

正则表达式

什么是正则表达式

简单的说,正则表达式就是处理字串的方法,他是以行为单位来进行字串的处理行为, 正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到“搜寻/删除/取代”某特定字串的处理程序!

正则表达式基本上是一种“表达式”, 只要工具程序支持这种表达式,那么该工具程序就可以用来作为正则表达式的字串处理之用。 例如 vi, grep, awk ,sed 等等工具,因为她们有支持正则表达式, 所以,这些工具就可以使用正则表达式的特殊字符来进行字串的处理。但例如 cp, ls 等指令并未支持正则表达式, 所以就只能使用 Bash 自己本身的通配符而已。

是 Linux 基础当中的基础,如果学成了之后,一定是“大大的有帮助”的!这就好像是金庸小说里面的学武难关:任督二脉! 打通任督二脉之后,武功立刻成倍成长!

关于语系

在英文大小写的编码顺序中,zh_TW.big5 及 C 这两种语系的输出结果分别如下:

LANG=C 时:0 1 2 3 4 ... A B C D ... Z a b c d ...z
LANG=zh_TW 时:0 1 2 3 4 ... a A b B c C d D ... z Z
11414906-9202fd962e4bbaf8.png
重点 11414906-9202fd962e4bbaf8.png
[:alnum] 代表所有的大小写英文字符和数字 0-9 A—Z a-z
[:alpha:] 代表任意英文大小写字符  A-Z a-z
[:lower:] 代表小写字符       a-z
[:upper:] 代表大写字符        A-Z
[:digit:] 代表数字         0-9

练习示例文件

"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh! My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird
digit_20191217152106.png
xx_20191217152918.png
11414906-e103d416eb4b9b7b.png
11414906-076f52e0912edc67.png
11414906-3559c6cea2602b03.png
 ^ 搜索以什么开头的一行
    [root@biudefor script]# grep '^#' zhengze.sh 
    # I am VBird
 
    $ 搜索以什么结尾的那一行
    [root@biudefor script]# grep '!$' zhengze.sh 
    Oh! My god!
    gooooooogle yes!
    
    . 相当于一个字符替代品 e.e=eae/ebe/ece
    [root@biudefor script]# grep 'e.e' zhengze.sh 
    "Open Source" is a good mechanism to d'eve'lop programs.
    How'eve'r, this dress is about $ 3183 dollars.
    the symbol '*' is repr'ese'nted as start.
    
    \ 将反斜线后的一个特殊符转义成普通字符
    [root@biudefor script]# grep \' zhengze.sh 
    this dress doesn't fit me.
    I can't finish the test.
    the symbol '*' is represented as start.
    go! go! Let's go.
    
    * 匹配*前面的零个或无穷多个前一个字符
    'ess*' 可以匹配到ess或者es
    'es*' 可以匹配到es或者e
    'ess*'和'eeeess*'的差别在于eeeess的前提条件发生改变
    [root@biudefor script]# grep 'ess*' zhengze.sh
    
    [] 匹配[]括号中的任意'一个' 字符,里面的字符取 或 的关系
    [root@biudefor script]# grep 'g[ojdhdff]d' zhengze.sh 
    Oh! My god!
    
    [n1-n2] 匹配一个范围
    [^] []括号内取反
    
    \{n,m\}  连续的n到m 个前一个字符
    [root@biudefor ~]# grep 'go\{1,2\}g' /script/zhengze.sh
    'goog'le is the best tools for search keyword.
    [root@biudefor ~]# grep 'go\{1,2\}' /script/zhengze.sh
    "Open Source" is a 'goo'd mechanism to develop programs.
    Oh! The soup taste 'goo'd.
    Oh! My 'go'd!
    'goo'gle is the best tools for search keyword.
    'goo'ooooogle yes!
    'go'! 'go'! Let's 'go'.

进阶 grep

[root@biudefor script]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1422836      0 143012    0    0     3     1   48   50  0  0 100  0  0
[root@biudefor script]# vmstat | grep -v procs
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1422916      0 143044    0    0     3     1   48   50  0  0 100  0  0
#### grep -v 能过滤掉不需要的某一行

[root@biudefor ~]# grep mail -B2 -A3 /etc/passwd    //显示 /etc/passwd 含有 mail 的行及其前2行和后 3 行
------------------------------------------------------------------
[root@biudefor ~]# grep mail -C 2 /etc/passwd      //显示  /etc/passwd 含有mail 的行以及前两行和后三行
------------------------------------------------------------------
[root@biudefor ~]# grep -o mail /etc/passwd        //只显示匹配到到的字符
mail
mail
mail
------------------------------------------------------------------
[root@biudefor ~]# grep -o -c 'mail' /etc/passwd  //只显示匹配到的字符并统计数量
1
-------------------------------------------------------------------
[root@biudefor ~]# grep -l 'nologin' /etc/passwd  //只显示文件名
/etc/passwd
-------------------------------------------------------------------
[root@biudefor ~]# grep -r 'mail' /etc   //递归,可以指定目录查找
-------------------------------------------------------------------
[root@biudefor ~]# grep -n 't[ea]st' /script/zhengze.sh   //搜索test或tast并显示行号
-------------------------------------------------------------------
[root@biudefor script]# grep -n '[^g]oo' zhengze.sh   //搜索oo当前面不要有g
2:apple is my favorite 'foo'd.
3:'Foo'tball game is not use feet only.
18:'goo'gle is the best 'too'ls for search keyword.
19:g'ooo''ooo'ogle yes!
-------------------------------------------------------------------
[root@biudefor script]# grep '[^a-z]oo' zhengze.sh //显示oo前面不是小写字符的行
[root@biudefor script]# grep '[^[:lower:]]oo' zhengze.sh
'Foo'tball game is not use feet only.
-------------------------------------------------------------------
[root@biudefor script]# grep '^[^[:lower:]]oo' zhengze.sh  //开头不是英文的行
"Open Source" is a good mechanism to develop programs.
# I am VBird
###### 符号 ^ 在 [] 内时是取反的意思,在 [] 之外是行首的意思
-------------------------------------------------------------------
[root@biudefor script]# grep '^[^#;]' zhengze.sh   //开头不是#,;
-------------------------------------------------------------------
[root@biudefor script]# grep '\.$' zhengze.sh  //不是以.结尾的行,\转义
-------------------------------------------------------------------
[root@biudefor script]# grep '^g.*o$' zhengze.sh  //g开头,o结尾,中间字符任意
-------------------------------------------------------------------
[root@biudefor script]# grep 'go\{2,4\}g' zhengze.sh  //查找含有2到4个o ,且以 g 结尾的字符串
google is the best tools for search keyword.

wc

[root@biudefor script]# grep 'g.*' zhengze.sh | wc
     10      58     315   //行数,单词数,字符数
[root@biudefor script]# grep 'g.*' zhengze.sh | wc -l  //只显示行数
10
[root@biudefor script]# grep 'g.*' zhengze.sh
"Open Source" is a good mechanism to develop programs.
Football game is not use feet only.
Oh! The soup taste good.
Oh! My god!
The gd software is a library for drafting programs.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
gooooooogle yes!
go! go! Let's go.

扩展正则

11414906-25c3f5d58e017037.png

支持扩展正则的工具

  • grep -E
  • egrep
  • sed
  • awk

须掌握:

^           行首定位符 ^love 
$           行尾定位符 love$ 
.           匹配单个字符 l..e 
*           匹配前导符 0 到多次 ab*love
.*          任意多个字符
[]          匹配指定范围内的一个字符 [lL]ove
[ - ]       匹配指定范围内的一个字符 [a-z0-9]ove
[^]         匹配不在指定组内的字符 [^a-z0-9]ove
\           用来转义元字符 love\. 
\<          词首定位符 \<love 
\>          词尾定位符 love\> 
\(..\)       匹配稍后使用的字符的标签(只能栝1-9个) :% s/172.16.130.1/172.16.130.5/
            :% s/\(172.16.130.\)1/\15/
            :% s/\(172.\)\(16.\)\(130.\)1/\1\2\35/
            :3,9 s/\(.*\)/#\1/ 
x\{m\}       字符 x 重复出现 m 次 o\{5\} x\{m,\} 字符 x 重复出现 m 次以上 o\{5,\} 
x\{m,n\}     字符 x 重复出现 m 到 n 次 o\{5,10\} 

===扩展正则表达式元字符
+               匹配一个或多个前导字符 [a-z]+ove 
?               匹配零个或一个前导字符 lo?ve 
a|b             匹配 a 或 b love|hate
()              组字符 loveable|rs love(able|rs) ov+ (ov)+
(..)(..)\1\2     标签匹配字符 (love)able\1er
x{m}            字符 x 重复 m 次 o{5} 
x{m,}           字符 x 重复至少 m 次 o{5,}
x{m,n}          字符 x 重复 m 到 n 次 o{5,10}

正则匹配示例:vim
/love/                  寻找love
/^love/                 love开头
/love$/                 love结尾
/l.ve/                  l 中间有任意一个字符,后面是 ve
/lo*ve/                 o可以出现零次到多次
/[Ll]ove/               匹配love或Love
/love[a-z]/             love后面有一个任意的小写字母
/love[^a-zA-Z0-9]/       love后面出现的字符不是a-zA-Z0-9中的任意一个字符,可能是特殊字符
/.*/                    整行
/^$/                    空行
/^[A-Z]..$/              开头是大写字母,结尾是两个任意字符
/^[A-Z][a-z]*3[0-5]/      开头是大写字母,后面是0-n个小写字母,然后3,最后是0-5的一个数字
/[a-z]*\./               前面是0-n个小写字母,后面加一个  .
/^ *[A-Z][a-z][a-z]$/     以0-n个空格开头的,后面是一个大写字母和两个小写字母
/^[A-Za-z]*[^,][A-Za-z]*$/      开头是大写字母或小写字母,后面不能是逗号,结尾是零个或n个大写或小写字母
/\<fourth\>/              寻找fourth这个单词
/\<f.*th\>/               寻找f 任意字符 th
/5{2}2{3}\./              55333.

空行
/^$/                      空行
/^[ \t]*$/                 0-n个空格或tab
注释行
/^#/                       以#开头的行
/^[ \t]*#/                  开头有0-n个空格或tab,后面有#号的行

:1,$ s/\([Oo]ccur\)ence/\1rence/ 
:1,$ s/\(square\) and \(fair\)/\2 and \1/
    hello*          0-n     前一个字符
    hello?          0-1     前一个字符
    hello+          1-n     前一个字符
    hello{2}         2      前一个字符
    
    (hello)*        0-n     前一个字符组
    (hello)?        0-1     前一个字符组
    (hello)+        1-n     前一个字符组
    (hello){2}       2      前一个字符组


相关文章

  • 正则表达式

    Python正则表达式初识(一) Python正则表达式初识(二) Python正则表达式初识(三) Python...

  • 正则表达式(1)

    本博客来自精通正则表达式第三版 第一章:正则表达式入门(Introduction to regex) 正则表达式概...

  • 2018-11-02jmeter关联,正则表达式

    在线工具 一、Jmeter关联的方式 2、设置正则表达式提取器 三、关于正则表达式的举例说明 正则表达式: 1.取...

  • 常用的正则表达式

    一、主要是验证数字的常见正则表达式: 二、主要校验字符的正则表达式: 三、特殊需求正则表达式: 下面给大家介绍在前...

  • R 正则表达式

    前言 R中的正则表达式模式有三种 1、扩展正则表达式:默认方式 2、Perl风格正则表达式:设置参数perl = ...

  • day 14

    第十一章 Linux正则表达式与三剑客知识应用实践 1.1、正则表达式 1.1.1、介绍 通过正则表达式可以将...

  • 正则表达式最佳实践

    主要内容包括 一、简介二、正则表达式的PlayGround三、基本语法表及简介四、正则表达式实例五、正则表达式在I...

  • python group()

    正则表达式中的三组括号把匹配结果分成三组group() 同group(0)就是匹配正则表达式整体结果group(1...

  • 正则表达式快速入门

    正则表达式的引擎分为三种:NFA、DFA、POSIX NFAJavaScript 使用的是 NFA 的正则表达式引...

  • 粗通正则表达式

    前言 本文并非原创,内容分别摘自维基百科、《精通正则表达式》第三版、正则表达式30分钟入门教程。 什么是正则表达式...

网友评论

      本文标题:三、 正则表达式

      本文链接:https://www.haomeiwen.com/subject/qgounctx.html