正则表达式学习笔记

2017-09-20|Categories: Linux|Tags: |

网上有许多优秀的正则表达式教程和示例,但如果直接拿来使用,可能无法得到预期的结果,比如教程说\d匹配一个任意数字,你马上照着葫芦画瓢,用grep '^\d{6}$' test.txt想找出6位连续数字(邮政编码),结果啥也没找到,test.txt里面明明有那么多符合条件的字符串,怎么回事?

原因很简单,不同程序支持不同的正则表达式引擎,而不同的引擎支持不同的语法,彼此之间很多时候并不兼容。

常用正则表达式引擎

  • POSIX正则表达式
    • BRE = Basic Regular Expressions
    • ERE = Extended Regular Expressions
  • Perl正则表达式

BRE和ERE都属于POSIX标准,在Unix的传统工具中被广泛支持,例如:grepsed默认使用BRE,加上特定选项可以识别ERE;egrepawk使用ERE。

Perl正则表达式已经成为事实上的标准,许多编程语言和应用软件支持与Perl兼容的正则表达式语法。

区别

BRE vs ERE

  • BRE拥有的元字符,ERE全都有
  • ERE增加了?+|三个元字符
  • ERE直接把(){}当做元字符,BRE需要先用反斜线转义\(\)\{\}

POSIX vs Perl

功能

Perl offers much more functionality: "lazy" regexes, backtracking, named capture groups, and recursive patterns, all of which are powerful additions to POSIX BRE/ERE.

https://en.wikipedia.org/wiki/Regular_expression#Standards

字符类

https://en.wikipedia.org/wiki/Regular_expression#Character_classes

更详细的对比

This table summarizes the meaning of various strings in different regexp syntaxes. It is intended as a quick reference, rather than a tutorial or specification.

http://www.greenend.org.uk/rjk/tech/regexp.html

示例

grep可以支持BRE/ERE/Perl:

sed添加-r选项可以支持ERE,awk直接使用ERE:

参考资料

Leave A Comment