正则表达式

这两天工作上用到了 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次)