• 7.正则RE


    正则表达式 RE

    1、正则表达式应用环境

    • 重要的文本处理工具:vim、sed、awk、grep
    • 各种语言和应用程序: mysql、oracle、php、python、Apache、Nginx ..

    2、什么是正则表达式

    • 正则表达式(Regular Expression,通常简称为 regex 或 RE)是一种字符表达方式,可以用它来 查找匹配特定准则的文本。在许多编程语言中都有用到正则表达式,常用它来实现一些复杂的匹 配。这里简单介绍一下 shell 中常用到的一些正则表达式。
    • 正则表达式是对字符串进行操作的一种逻辑公式,即用事先定义好的的一些特定字符以及这些特定 字符的组合,组成一个有一定规则的字符串(Regular Expression),使用这个有一定规则的字符 串来表达对字符串的一种过滤逻辑。正则表达式被广泛应用于Linux和许多其他编程语言中,而且 不论在哪里,其基本原理都是一样的。
    • 正则表达式是由两个基本组成部分所建立:一般字符与特殊字符。一般字符是指没有任何特殊意义 的字符;特殊字符,常称为元字符 (metacharacter),或 meta 字符,正则表达式将匹配被查找 行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。在某些情况下,特殊字 符也可被视为一般字符(使用转义符 进行转义)。
    • POSIX 有两种风格的正则表达式,基本正则表达式(BRE)和扩展正则表达式(ERE)。这两种风 格的正则表达式在一些字符含义上有细微的差距。以常用的 grep 指令来说,grep 指令默认支持的 是 BRE,若要使用 ERE 进行匹配,可以使用 -E 选项,接下来的例子中均使用 grep 指令来演示正 则表达式的使用。
    • 正则表达式 Shell 使用场景
    # 匹配数字
    ^[0-9]+$ 123 456 5y7
    # 匹配Mail
    [a-z0-9_]+@[a-z0-9]+.[a-z]+ qfedu@1000phone.com
    # 匹配IP
    [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
    
    或
    [[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}
    
    
    [root@localhost ~]# egrep '([0-9]{1,3}.){3}[0-9]{1,3}' /etc/sysconfig/network-scripts/ifcfg-ens33
    

    3、正则表达式元字符和 Shell 通配符

    • shell 元字符(也称为通配符);由shell来解析,如rm -rf .pdf,元字符Shell将其解析为任意多个字符
    • 正则表达式元字符;由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、 awk、python
    # shell元字符
    [root@localhost ~]# ls *.log
    ping.log
    
    # 正则表达式元字符
    [root@localhost ~]# grep 'root*' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    
    # vim
    # /etc/passwd
    :1,$ s/root/123/g
    :1,$ s/[rR]oot/123/g
    
    

    4、正则表达式元字符

    字符 BRE/ERE 含义
    . BRE&ERE 匹配任意单个字符(除字符串结束符 NUL)
    ^ BRE&ERE 匹配行首,如 ^abc,匹配以 abc 开头的字符串
    $ BRE&ERE 匹配行尾,如 abc$,匹配以 abc 结尾的字符串
    * BRE&ERE 匹配 0 个或任意多的单个字符,前置字符可以是正则表达式
    + ERE 匹配前面正则表达式的 1 个或多个实例
    ? ERE 匹配前面正则表达式的 0 个或 1 个实例
    [...] BRE&ERE 方括号表达式,匹配方括号内的任一字符,常配合 - 符使用,表示匹配一 个连续的范围。 ^ 字符作为方括号内的第一个字符表示匹配不在方括号内 的任意字符
    - BRE&ERE 连字符,在方括号表达式中使用,表示连续字符的范围(范围会因 locale 而有所不同,因此不具可移植性)
    {n,m} ERE 区间表达式,表示匹配在它前面的字符 n 到 m次。其中,n 与 m 的值必 须介于 0-RE_DUM _MAX(含)之间,后者最小值为255
    {n} ERE 表示匹配在这之前的字符 n 次
    {n,m} ERE 功能同 {n,m}
    {n} ERE 功能同{n}
    BRE&ERE 转义符
    () ERE 匹配位于方括号括起来的正则表达式群
    ( ) ERE 将( 与 ) 之间的模式保存在特殊的“保留空间”中,最多可以存储9个,可以 通过后续的转义序列 来匹配保留空间中的模式
    ERE 与 ( ) 结合起来使用,1匹配第一个子模式、 2匹配第二个,最多到 9
    | ERE 匹配位于 | 符号前或后的正则表达式

    5、正则表达式应用举例

    .* 所有字符
    [] 非字符组内的字符开头的行
    [a-z] 小写字母
    [A-Z] 大写字母
    [a-Z] 小写和大写字母
    [0-9] 数字
    < 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
    > 单词尾

    5.1、grep 使用的元字符

    注:grep也可以使用扩展集中的元字符,仅需要对这些元字符前置一个反斜线

    • grep: 使用基本元字符集 ^, $, ., *, [], [^], < >, (), {}, +, |

    • egrep(或grep -E): 使用扩展元字符集 ?, +, { }, |, ( )

    • w 所有字母与数字,称为字符[a-zA-Z0-9] 'l[a-zA-Z0-9]ve' 'lw*ve'

    • W 所有字母与数字之外的字符,称为非字符 'love[a-zA-Z0-9]+' 'loveW+'

    •  词边界 '<love>' 'love'

    • 使用 grep 命令对 /etc/passwd 文件进行查找匹配操作:

    [root@localhost ~]# grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    
    # grep r..t /etc/passwd
    # grep roo* /etc/passwd
    
    [root@localhost ~]# grep 'roo*' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    
    # grep -E roo+ /etc/passwd
    # grep -E ro+ /etc/passwd
    
    • 使用 + 字符可以匹配在其前面的 1 个或多个字符,与 * 字符有些许的差别,另外, + 字符实在 ERE 风格下使用的,故需要使用 grep 命令的 -E 选项
    # grep ^t /etc/passwd
    # grep ^t.*h$ /etc/passwd
    # grep [Nn]et /etc/passwd
    # grep [a-z]c /etc/passwd
    # grep [^a-z]c /etc/passwd		//取反[^]; ^[]行首
    

    1.使用 {n.m} 区间表达式来匹配指定的次数

    • 这个表达式可以用来匹配指定的次数,其中 {n,m} 表示匹配在其前面的字符 n 到 m次,{n,} 表示 至少匹配 n 次,{,m} 表示最多匹配 m 次,而 {n} 则是精准匹配 n 次。在 BRE 中,使用的是 {n,m} 的形式来实现相同的功能。n 与 m 的值必须介于 0 至 RE_DUP_MAX(包含这个值)之间,后者的 最小值为255
    # grep 0'{3}' /etc/passwd
    # grep -E 0{3} /etc/passwd
    

    2.使用 ( ) 保存已匹配的字符,并通过 来引用已保存的匹配字符串

    • 使用 ( ) 会先匹配括号中的字符串,然后将匹配到的字符串保存在由正则表达式解析器预定义好的 叫做寄存器的变量中,其编号从1到9,也就是说最多可以保存9组字符串,使用 可以取出所保 存的字符串,其中 n 为1到9,分别对应9个寄存器的值
    [root@localhost ~]# cat text.txt
    root::<asdfafaetweorootweotuasfjl:root
    root::<asdfafaetweorootweotuasfjl:root123
    rootroot
    root
    [root@localhost ~]# echo "root2root" >>text.txt
    [root@localhost ~]# grep -E '(root).*1$' text.txt
    root::<asdfafaetweorootweotuasfjl:root
    rootroot
    root2root
    
    
    [root@localhost ~]# grep -E '(.).*1' text.txt		//前后匹配相同字符之间的字符穿
    root::<asdfafaetweorootweotuasfjl:root
    root::<asdfafaetweorootweotuasfjl:root123
    rootroot
    root
    root2root
    
    • 正则表达式 ^(.).*1$ 将匹配一个行首字符和行尾字符相同的字符串。

    5.2、POSIX 方括号表达式

    • 为了配合非英语的环境,POSIX 标准强化其字符集范围的能力 (如 [a-z]),以匹配非英文字母字 符。POSIX 使用方括号表达式 [...] 来表示一个范围值,在方括号表达式里,除了字面上的字符外 (a、b、c等),另有额外的组成部分,包括:
    1. 字符集:以 [: ... :] 将关键字组合括起来的 POSIX 字符集,关键字描述各种不同的字符集;
    2. 排序符号:排序符号将多个字符序列视为一个单位(如,locale 中将 ch 这两个字符视为一个单 位),它使用 [. 与 .] 将字符组合括起来,在系统所使用的特定 locale 上各有其定义;
    3. 等价字符集:等价字符集列出的是应视为等值的一组字符,它由取自于 locale 的名字元素组成, 以 [= 与 =] 括住。
    4. POSIX 字符集列表:
    类型 匹配字符
    [:alnum:] 数字字符
    [:alpha:] 字母字符
    [:blank:] 空格与定位符
    [:cntrl:] 控制字符
    [:digit:] 数字字符
    [:graph:] 非空格字符
    [:lower:] 小写字母字符
    [:upper:] 大写字母字符
    [:space:] 空白符
    [:print:] 可显示的字符
    [:punct:] 标点符号字符
    [:xdigit:] 十六进制数字
    • 注意,字符集要放到方括号表达式中,因此一般会出现类似 [[:alpha:]] 的表达式。
    • 正则表达式匹配所有的大写字母
    # grep [[:upper:]] /etc/passwd
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    
    
    配置若有遗漏或错误,请评论留言。
  • 相关阅读:
    Oracle Scheduler Postponed job
    MySQL字符集问题
    LogMiner的一个案例
    Oracle Scheduler NLS_ENV
    ORA01555的模拟
    在线重定义 Oracle Redefinition
    MySQL Proxy 读写分离
    SQL判断分段的连续值
    基础复习之.net中new关键字的用法
    VB与C#相互转换
  • 原文地址:https://www.cnblogs.com/BrokenEaves/p/14894695.html
Copyright © 2020-2023  润新知