基本正则与扩展正则

上一篇学习了一些文本处理的工具之后,发现grep支持的正则包含基本正则和扩展正则,之前没有系统的学习过这些正则的细节和区别,现在学习一下。

基本正则表达式(BRE, basic regular expressions)

字符匹配

正则符号 符号的含义
. 匹配任意单个字符
[] 匹配指定范围内的任意字符
[^] 匹配指定范围外的任意字符
[:alnum:] 字母和数字
[:alpha:] 任何英文大小写字符,即A-Z,a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:black:] 空白字符(空格和TAB)
[:space:] 水平和垂直空白字符(范围大于上一个,包含\n等)
[:cntrl:] 不可打印控制字符(退格、删除等)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印非空白字符
[:print:] 可打印字符
[:pumct:] 标点符号

几个小例子

[]匹配其中的任一字符

1
2
x@LAPTOP-MRV29Q6U$ echo "abcdABCD"|grep "a[a-z]"
ab

[^]匹配非其中的字符

1
2
x@LAPTOP-MRV29Q6U$ echo "abcdABCD"|grep "A[^a-z]"
AB

匹配次数

用来指定所给出的匹配字符,出现的次数,满足限定才会被匹配出来

符号 含义
* *前的字符出现0次或者任意次
.* 任意长度的任意字符串
? 匹配前面的字符0或者1次
\+ 匹配前面的字符串至少一次,即大于等于一次
\ {n\ } 匹配前面的字符n次
\ {m,n\ } 匹配前面的字符大于等于m次,小于等于n次
\ {,n\ } 匹配前面的字符小于等于n次
\ {m,\ } 匹配前面的字符大于等于m次

位置锚定

确定匹配子串出现的位置。

符号 含义
^ 匹配行首,用在pattern的最左侧
$ 匹配行尾,用在pattern的最右侧
\<pattern 以对应匹配为词首的单词
pattern\> 以对应匹配为词尾的单词
\b 表示单词的边界,既可以表示单词的词首,也可以表示单词的词尾

分组

通过\ (\ ) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\ (root\ )\ + 匹配 root 字符至少一次 如 root,rootroot,rootrootroot

后向引用:\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符结果,而不是相应的模式;同样,\2代表左起第二个左括号和与其匹配的右括号之间的模式所匹配到的结果

\|: 匹配或条件,比如:\ (C\ |c \ )at 可以匹配Cat 或cat。

扩展正则表达式(ERE, extended regular expressions)

扩展正则表达式可以认为是对基础正则的简化,直观上的表现 :
如进行分组时 基础正则使用\(\),而扩展正则,则直接使用()
grep sed 等文本处理工具,配上指定的选项,可进行扩展正则的使用, grep -E 或 egrep

基本语法、位置锚定

与基础正则一致

匹配次数

符号 含义
* *前的字符出现0次或者任意次
.* 任意长度的任意字符串
? 匹配前面的字符0或者1次
+ 匹配前面的字符串至少一次,即大于等于一次
{n} 匹配前面的字符n次
{m,n } 匹配前面的字符大于等于m次,小于等于n次
{,n } 匹配前面的字符小于等于n次
{m,} 匹配前面的字符大于等于m次

分组

通过() 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:(root)+ 匹配 root 字符至少一次 如 root,rootroot,rootrootroot

后向引用:\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符结果,而不是相应的模式;同样,\2代表左起第二个左括号和与其匹配的右括号之间的模式所匹配到的结果

|: 匹配或条件,比如:(C |c )at 可以匹配Cat 或cat。

二者之间的区别

这两者的区别是:正则表达式的扩展规范和基本规范基本相同。只是在基本规范下,有些字符(? + {} | () )应解释为普通字符,要表达上述特殊含义,则需要加 \ 转义。反之,在扩展规范下,? + {} | () 应被理解成特殊含义,要取其字面值,也要对其进行 \ 转义。


基本正则与扩展正则
https://chujian521.github.io/blog/2022/11/25/基本正则与扩展正则/
作者
Encounter
发布于
2022年11月25日
许可协议