说到正则表达式(Regular Expression)不得不提到正则文法,这俩是等价的可以互相转换。同时,他俩与有限状态自动机(Finite State Automaton)也是等价的,实际上那些支持正则表达式的工具,比如grep、awk内部都是使用有限状态自动机来识别正则表达式的。这里厘清一下它们之间的关系:
- 0型文法,即无限制文法,可以被图灵机识别(能使图灵机停机的字符串)。
 - 1型文法,即上下文相关文法,产生规则为 αAβ → αγβ 1,可以被线性有界非确定图灵机识别。
 - 2型文法,即上下文无关文法,产生规则为 A → γ 2,可以使用巴科斯范式(BNF)表达,可以被下推自动机识别,包括LL(1)、LR(1)等语法分析器,基本所有的编程语言都是属于2型文法。
 - 3型文法,即正则文法,产生规则为 A → aB, A → a 3,可以用正则表达式表达,可以被有限状态自动机识别,包括非确定有限自动机(NFA, Nondeterministic Finite Automaton)和确定有限自动机(DFA, Deterministic Finite Automaton)。
 
正则文法和正则表达式
正则文法分为左线性文法和右线性文法,对于文法 G = (N, Σ, P, S),如果产生形式如下:
A → aB
A → a
C → ε
则称为右线性文法,其中A, B, C属于N的非终结符,a, ε属于Σ的终结符,ε表示空串。反之,为左线性文法。
正则表达式基本的定义如下:
字母表中的任意字母是正则表达式,空串和空集也是正则表达式; 如果r, s是正则表达式,那么r|s, rs, r*, (r)也是正则表达式。
正则文法和正则表达式之间可以互相转换,比如:
一个右线性文法 G = (N, Σ, P, S),其中 N = {S, A},Σ = {a, b, c},S 是起始符号,P 包含下述规则:
S → aS
S → bA
A → ε
A → cA
对应的正则表达式为 a*bc*。
将正则表达式转换成NFA
参考龙书 词法分析 章节
自顶向下解析正则表达式
正则表达式备忘
元字符表
| Perl类 | POSIX类 | 说明 | 
|---|---|---|
\a | 
      [:alpha:] | 
      英文字母 [a-zA-Z] | 
    
\l | 
      [:lower:] | 
      小写英文字母 [a-z] | 
    
\u | 
      [:upper:] | 
      大写英文字母 [A-Z] | 
    
\d | 
      [:digit:] | 
      数字 [0-9] | 
    
\D | 
      [^[:digit:]] | 
      非数字 | 
\x | 
      [:xdigit:] | 
      十六进制数字 [0-9a-fA-F] | 
    
[:alnum:] | 
      英文字母和数字 [0-9a-zA-Z] | 
    |
\w | 
      [[:alnum:]_] | 
      英文字母、数字和下划线 | 
\W | 
      [^[:alnum:]_] | 
      非英文字母、数字和下划线 | 
[:graph:] | 
      可打印的非空白字符 | |
\p | 
      [:print:] | 
      可打印字符 | 
[:blank:] | 
      空白字符(空格和tab) | |
\s | 
      [:space:] | 
      所有空白字符(还包括回车、换行等) | 
\S | 
      [^[:space:]] | 
      非空白字符 | 
常用表达式
| 表达式 | 说明 | 
|---|---|
[\u4e00-\u9fa5] | 
      匹配中文字符(unicode) | 
[^\x00-\xff] | 
      匹配双字节字符(包括汉字在内) | 
\n[\s│ ]*\r | 
      匹配空行 | 
/<(.*)>.*<\/\1>│<(.*) \/>/ | 
      匹配HTML标记 | 
(^\s*)│(\s*$) | 
      匹配首尾空格 | 
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* | 
      匹配Email地址 | 
http://(/</a>[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? | 
      匹配URL |