Skip to main content

Regex 速记

· 4 min read

需要注意的是, 由于正则在不同的流派中表示有所不同,只能整理一些几乎雷同的. 不同流派之间的差异,很多在是否需要转义上,例如 在有些流派里 () 要写成 \(\) 这里整理的主要是 PCRE 流派的正则语法

字符表示

字符缩进表示 : \n,\t,\a,\b,\e,\f,\r,\v

八进制转义 : \num

十六进制转义/Unicode 转义 : \xnum,\x{num},\unum,\Unum

控制字符 : \cchar

字符及相关结构

普通字符组 : [a-z].[^a-z]

几乎能匹配任何字符的元字符 : .

单个字节 : '\C'

Unicode 组合字符序列 : \X

字符组简记(大写为排除) : \w,\W,\s,\S,\d,\D

Unicode 属性区域和分类 : \p{prop},\P{prop}

POSIX "字符组"方括号表示 : [[:alpha:]]

POSIX "Collating 序列" 方括号表示 : [[.span.-11.]]

POSIX "字符等价类" 方括号表示 : [[=n=]]

锚点及其他 "零长度断言"

行/字符串起点 : ^, \A

行/字符串终点 : '$. \Z, \z'

本次匹配的开始位置/上次匹配的结束位置 : \G

单词分界符 : \b,\B,\<,\>

顺序环视 : (?=...), (?!...)

逆序环视 : (?<=...),(?<!...)

注释和模式修饰词

模式修饰词 : (?modifier),(-?modifier) : eg:(?i)...(?-i)

模式作用范围 : (?modifier:...) : eg:(?i:....)

注释 : (?#...),#...

文本范围 : \Q,\E

分组,捕获,条件判断和控制

捕获/分组 : (...),\1,\2

仅用于分组 : (?:...)

命名捕获 : (?<name>...)

固化分组 : (?>...)

多选 : ...|...|...

条件判断 : (?if then|else)

匹配优先量词 : *,+,?,{m,n}

忽略优先量词 : *?,+?,??,{m,n}?

占有优先量词 : *?,++,?+,{m,n}+

命名字符组

关于这些字符组的命名,可以参考susv-ctype.需要注意的是,在 unicode 里,这些字符组的定义要根据 unicode 的定义来判断.会包含额外的同义的字符.

描述
[:alnum:]
[:alpha:]字母
[:blank:]空白
[:cntrl:]控制符
[:digit:]
[:graph:]可显示
[:lower:]小写
[:upper:]大写
[:space:]包括 [:blank:], 换行, 回车及其他

测试引擎类型

nfa|nfa.not 匹配 nfa.not

匹配结果说明
nfa传统 NFA
nfa.notPOSIX / DFA

DFA 不支持捕获型括号和回溯

x(.+)+x 匹配 =xx============================================================

匹配结果说明
时间长NFA
时间短DFA, 但也有可能是混合的或优化的
引擎工具
DFAawk, egrep, flex, lex, MySQL, Procmail
Tranditional NFAGNU Emacs, Java, grep, less, more, .NET, PCRE, Perl, PHP, Python, Vi, Ruby, sed
POSIX NFAmawk, Mortricekern System;s utiles, GNU Emacs
DFA/NFAGNU awk, GNU grep, Tcl

匹配基础

规则 1 : 优先选择最左端的匹配结果

规则 2 : 标准量词是匹配优先的

NFA : 表达式主导

DFA : 文本主导,不关心表达式的形式 : 即 x*=x?x?...=(x(x(x...)?)?)?

匹配优先量词和忽略优先量词控制,对回溯状态选择,是跳过还是进行.

环视模拟固化分组 : (?>...) => (?=(...))\1

多选结构即非匹配优先,也非忽略优先,而是顺序优先 : eg: (to|tow) =~ "tow" = "to"