这两天工作上用到了 grep、sed、awk 文本处理命令。有心在业余时间花心思多掌握一些,在此前提下,发现熟悉正则表达式是很重要的。
正则表达式
查阅维基百科,发现其中文词条 正则表达式 没有价值,个别的知识点即便有效也充斥在大量的垃圾信息里,此词条好似百度百科的众多词条,灌水横拉硬拽拼凑而成,或源于翻译英文词条时偷懒挑肥拣瘦,只翻译了一部分内容,却篡改章节目录造成“不成文”的感受。
其英文词条 Regular expression 相对“丰满”一些,看目录至少提到了不同标准、不同流派,比中文词条要好。
参考 正则表达式“派别”简述、正则表达式 流派(flavor)及差异简介,都明确指出了三种:
- BRE: Basic Regular Expression
- ERE: Extended Regular Express
- PCRE: Perl Compatible Regular Expression
其中,前两者都是 POSIX: Portable Operating System Interface 的规范。
常见的编程语言中使用正则表达式的记法,其实都源于 Perl。
现在的编程语言中的正则表达式,大部分都属于 PCRE 这个分支。
常见的正则表达式记法,其实都源于 Perl
但在 POSIX 的系统上,有关的工具使用正则表达式,其记法与上述不同,大都要落于 BRE、ERE 这两者之中:
- 使用BRE语法的命令有:grep、ed、sed、vim
- 使用ERE语法的命令有:egrep、awk、emacs
需要补充的一点是,在 linux 上有关工具对 BRE、ERE 语法是进行过扩充的,好比对 C 语言标准、C++ 语言标准进行的诸多 GNU 扩展。在 Linux/Unix 工具与正则表达式的 POSIX 规范 中有提到 GNU 扩展的相关内容,在 正则表达式“派别”简述 讲述 POSIX 标准时也提到了 GNU 扩展。
GNU 在实现了 POXIS 标准的同时,做了一定的扩展
PCRE
PCRE(Perl Compatible Regular Expression):可以说是正则表达式的老前辈(niel 注:需考证),它是从 Perl 衍生出来的一个显赫流派,\d
\w
\s
等表示法就是它的特征;
BRE
BRE(Basic Regular Expression):POSIX 规范的正则表达式之一,grep、vi、sed 都属于这一派,它显著的特征就是 (
)
{
}
这几个括号元字符必须经过转义才具有特殊含义,不支持 +
?
|
等元字符,随着时间发展,后来又出现了 GNU BRE,GNU BRE 支持上边这些字符,但是也必须都经过转义才能有特殊含义;
ERE
ERE(Extended Regular Express):也是 POSIX 规范的正则表达式之一,egrep awk 都属于这一派,(
)
{
}
+
?
|
等元字符可以直接使用不需要转义,这个流派后来也出现了 GNU ERE,在之前的基础上添加了支持 \1
\2
等。
参考
不明觉厉的 各种语言或工具软件的不同风格的正则表达式文法规定。
如果更关注使用有关工具时的细节,可以参考 Linux 中常用文本工具与正则表达式的关系 。更多的语法细节还是要在用到的时候仔细查阅。
引擎 正则表达式引擎及其分类
55分钟学会正则表达式 学习笔记
建议看原文(英文)比较好,译者也给出了原文的链接。翻译时译者不够细心,和原文相比有好几处错误,有的是很明显的上下文冲突,所以觉得译者根本就不用心。
前言部分,简单描述正则表达式是什么;之后讲解正则表达式的基础语法。
- 正则表达式有可能出现语法错误——不是所有的字符串都是正则表达式
字符
理解“元字符”概念。
普通字符只能匹配它们本身;元字符可以匹配一些特殊规则。使用反斜杠 \
可以忽略元字符,使得元字符的功能与普通字符一样。
点“.”
匹配任意一个字符
字符类
字符类是一组在方括号内的字符,表示可以匹配其中的任何一个字符。
重要提示:字符类中和字符类外的规则有时不同,一些字符在字符类中是元字符,在字符类外是普通字符。一些字符正好相反。还有一些字符在字符类中和字符类外都是元字符,这要视情况而定!
字符类的范围
在字符类中,你可以通过使用短横线来表示匹配字母或数字的范围。
字符类的反义
你可以在字符类的起始位放一个反义符 ^
。
Freebie character classes
译者翻译为“转义字符类”,个人觉得不能够表达原作的味道。参考上下文及“freebie”单词原意,应该是要表达,和某些字符类表示相同意义的转义字符。
下文中Freebie multipliers 译为“关于重复的转义字符”。类比,此处译为“关于字符类的转义字符”就会好很多。
\d
:[0-9]\w
:[0-9A-Za-z_]\s
:匹配一个空字符(空格,制表符,回车或者换行)\D
:[^0-9]\W
:[^0-9A-Za-z]\S
:匹配一个非空字符
重复
在字符或字符集之后,你可以使用 { }
大括号来表示重复
指定重复次数范围
Freebie multipliers
?
:{0,1},重复0次或1次*
:{0,},重复任意次(0次、1次或多次)+
:{1,},重复1次以上(包括1次)