Skip to content

Latest commit

 

History

History
162 lines (131 loc) · 8.39 KB

正则表达式.md

File metadata and controls

162 lines (131 loc) · 8.39 KB

正则表达式

一、正则表达式分类

  • 基本的正则表达式, Basic Regular Expression 又叫 Basic RegEx 简称 BREs
  • 扩展的正则表达式, Extended Regular Expression 又叫 Extended RegEx 简称 EREs
  • Perl 的正则表达式, Perl Regular Expression 又叫 Perl RegEx 简称 PREs

二、Linux 中常用文本工具与正则表达式的关系

  • grep/egrep:

    • grep 支持: BREsEREsPREs 正则表达式

      • grep 指令后不跟任何参数, 则表示要使用 "BREs"
      • grep 指令后跟 "-E" 参数, 则表示要使用 "EREs"
      • grep 指令后跟 "-P" 参数, 则表示要使用 "PREs"
    • egrep 支持: EREsPREs 正则表达式

      • egrep 指令后不跟任何参数, 则表示要使用 "EREs"
      • egrep 指令后跟 "-P" 参数, 则表示要使用 "PREs"
  • sed:

    • sed 文本工具支持: BREsEREs
    • sed 指令默认是使用 "BREs"
    • sed 命令参数 "-r" , 则表示要使用"EREs"
  • awk/gawk:

    • awk 文本工具支持: EREs
    • awk 指令默认是使用 "EREs"

三、断言

符号 名字 含义
reg(?=exp) 零宽度正先行断言 reg 匹配的内容后面内容满足 exp 规则
reg(?!exp) 零宽度负先行断言 reg 匹配的内容后面内容不满足 exp 规则
(?<=exp)reg 零宽度正后发断言 reg 匹配的内容前面内容满足 exp 规则
(?<!exp)reg 零宽度负后发断言 reg 匹配的内容前面内容不满足 exp 规则

(?=exp)零宽度正先行断言为例

  1. "先行"表示待校验的位置在前,即校验的位置在exp匹配的内容之前
  2. ""表示exp描述的规则,匹配校验位置后面的内容
断言元字符 意义:以0A1B2为例
^ 行首,字符串首 表示位置0
$ 行尾,字符串尾部,表示位置2
\b 字分界线,可以表示:0,2位置
\B 非字分界线,可以表示1位置
\A 目标的开头(独立于多行模式) 表示位置0
\Z 目标的结尾或位于结尾的换行符前(独立于多行模式) 表示位置2
\z 目标的结尾(独立于多行模式)表示位置2
\G 目标中的第一个匹配位置
A, Z, z, G很少使用

例1. 取运行级别

shell> cat /etc/inittab
...
id:3:initdefault:
...

shell>  grep -aPo '[0-9](?=:initdefault)' /etc/inittab
3

例2. 取系统版本

shell> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)

shell> grep -aPo '(?<=release\s)\d' /etc/redhat-release
7

四、各类型正则表达式比较

https://www.cnblogs.com/jiangzhaowei/p/5453004.html

含义 字符 Basic RegEx Extended RegEx Python RegEx Perl regEx
转义 \ \ \ \ \
匹配行首1 ^ ^ ^ ^ ^
匹配行尾2 $ $ $ $ $
匹配空行 ^$ ^$ ^$ ^$ ^$
匹配整行 ^string$ ^string$ ^string$ ^string$ ^string$
匹配左边界 \< \< \< N/A N/A(=\b)
匹配右边界 \> \> \> N/A N/A(=\b)
匹配左右边界 \<x\> \<x\> \<x\> N/A N/A(=\b)
匹配表达式 () N/A () () ()
匹配表达式 \(\) \(\) N/A(=()) N/A(=()) N/A(=())
匹配0,1次(={0,1}) ? N/A(=\?) ? ? ?
匹配0,1次(=\{0,1\}) \? \? N/A(=?) N/A(=?) N/A(=?)
非贪婪模式 ? N/A N/A N/A N/A
匹配字符(除\n)3 . . .((^$)|(.):Include\n) . .([.\n]:Include\n)
匹配任意多次(={0, }) * * * * *
匹配至少一次(=\{1,\}) \+ \+ N/A(=+) N/A(=+) N/A(=+)
匹配至少一次(={1, }) + N/A(=\+) + + +
匹配n次 {n} N/A(=\{n\}) {n} {n} {n}
匹配至少n次 {n,} N/A(=\{n,\}) {n,} {n,} {n,}
匹配n-m次 {n,m} N/A(=\{n,m\}) {n,m} {n,m} {n,m}
匹配 x 或 y x|y N/A(=x|y) x|y x|y x|y
匹配0-9数字 [0-9] [0-9] [0-9] [0-9] [0-9]
匹配此字符集 [xyz] [xyz] [xyz] [xyz] [xyz]
匹配非次字符集4 [^xyz] [^xyz] [^xyz] [^xyz] [^xyz]
匹配所有字母 [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z]
匹配非字母 [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z]
匹配数字(=[0-9]) \d N/A N/A \d \d
匹配非数字(=[^0-9]) \D N/A N/A \D \D
匹配非空白字符(=[^\f\n\r\t\v]) \S N/A N/A \S \S
匹配空白字符5 \s N/A N/A \s \s
匹配非单词数字 \W \W \W \W \W
匹配单词+数字+下划线 \w \w \w \w \w
匹配非单词边界 \B \B \B \B \B
匹配单词边界 \b \b \b \b \b
匹配横向制表符(=\x09,\cI) \t N/A N/A \t \t
匹配垂直制表符(=\x0b,\cK) \v N/A N/A \v \v
匹配换行符(=\x0a,\cJ) \n N/A N/A \n \n
匹配换页符(=\x0c,\cL) \f N/A N/A \f \f
匹配回车符(=\x0d,\cM) \r N/A N/A \r \r
匹配\ \\ \\ \\ \\ \\
匹配控制字符x6 \cx N/A N/A N/A \cx
匹配十六进制n, n为2位数字7 \xn N/A N/A N/A \xn
匹配引用 \num N/A \num \num N/A
匹配字母+数字 [:alnum:] [:alnum:] [:alnum:] [:alnum:] [:alnum:]
匹配字母 [:alpha:] [:alpha:] [:alpha:] [:alpha:] [:alpha:]
匹配数字 [:digit:] [:digit:] [:digit:] [:digit:] [:digit:]
匹配小写字母 [:lower:] [:lower:] [:lower:] [:lower:] [:lower:]
匹配大写字母 [:upper:] [:upper:] [:upper:] [:upper:] [:upper:]
匹配空白字符 [:space:] [:space:] [:space:] [:space:] [:space:]
空格和制表符 [:blank:] [:blank:] [:blank:] [:blank:] [:blank:]
匹配可见字符8 [:graph:] [:graph:] [:graph:] [:graph:] [:graph:]
匹配可打印字符9 [:print:] [:print:] [:print:] [:print:] [:print:]
匹配控制字符 [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:]
匹配标点符号10 [:punct:] [:punct:] [:punct:] [:punct:] [:punct:]
匹配十六进制数 [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:]

1 awk 指令中, "^" 则是匹配字符串的开始
2 awk 指令中, "$" 则是匹配字符串的结尾
3 awk指令中的 "." 能匹配换行符
4 "[^xyz]" 在awk 指令中则是匹配未包含的任意一个字符+换行符
5 包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v])
6 例如:\cM匹配一个Control-M 或回车符,x 的值必须为 A-Z 或 a-z 之一,否则,将 c 视为一个原义的 'c' 字符
7 '\x41' 匹配 "A"。'\x041' 则等价于'\x04' & "1"
8 不含空格和换行符
9 不含控制字符 "[:cntrl:]", 字符串结束符 "\0", EOF文件结束符("-1"), 但包括空格符号
10 不包括 "[:alnum:]"、"[:cntrl:]"、"[:space:]" 这些字符集