https://regexr.com/
http://tool.chinaz.com/regex/
https://github.com/google/re2/wiki/Syntax

Regular Expression

  • 默认每个子表达式会自动拥有一个组号,\0表示表达式本身
  • 零宽断言语法中所用到的前缀或后缀的修饰括号不算做一个子表达式
  • 注意:ERE取消了向前引用子表达式功能. 如果还要高级应使用ARE

BRE

. * ^ $ [^]: 注意^的2种含义
\(\): 子表达式,\2表第2个字表达式即向前引用字表达式
\{\}: 匹配次数
\b: 匹配单词的开头或结尾;或使用\<\>
\w: 匹配A-Za-z0-9_

ERE

在BRE的基础上增加以下3个元字符,同时取消了(){}前面的转义符: ? + |
(): 子表达式,匹配整个括号
{}: 匹配次数

EX

%(): 忽略右侧分组的分组号
zs: 只取匹配结果的某个部分的开始位置!ze:结束位置!

GNUX-Regex

\: 脱字符(如:\\表示\本身,\/表示/); \2表示取整个exp中的第2个子表达式
|: 分支条件,有短路特性: (james|jim|smith):从左到右匹配james jim smith中的一个
"": 引号中的字符串表示字符串本身,同样性质的还有[]
(): 子表达式框定符,嵌套时只需看左小括号从左到右排在第几个! (?开头的除外
^: 字符串开头; 在[]的开头位置则表示取反,此时优先级低: [^a-f0-3]表示除了a-f0-3之外的任意一个字符
$: 字符串结尾; 用子表达式的内容替换,如: (.*) - (.*)\.mp3 -> $2 - $1.mp3
\b: 单词的边界(使用贪婪法), \B
(?i)exp: exp忽略大小写

基础

.: 任意字符,换行符除外\w 字母、数字、下划线、汉字(中文系统); \W:取反
\s: 空格、\n \r \t \f、中文全角空格; \S
\d: [0-9], \D等价于[^0-9]

[[:alpha:]]: 字母
[[:alnum:]]: 字母+数字
[[:lower:]]: 小写字母,upper
[[:digit:]]: 数字
[[:punct:]]: 标点
[[:print:]]: 任意可打印字符
[[:blank:]]: 空格+TAB
[[:space:]]: 空格+TAB+\t+VT+NL+CR+FF

\v: 竖向制表符
\a: 报警符,打印之会嘀的一声
\e: Escape
\k: 引用前面自定义名称的子表达式
\0nn: ASCII代码中,八进制代码为nn的字符\k{name1}
\xnn: ASCII代码中,十六进制代码为nn的字符
\unnnn: Unicode代码中,十六进制代码为nnnn的字符
(?#comment): 注释,不对表达式产生任何影响

  • {}
    左侧字符或表达式的重复次数;后面加上一个问号表示匹配时,不使用贪婪法
    {n}: 重复n次
    {n,} {n,}?: 重复n次以上[n,+),但尽可能的少重复
    {n,m} {n,m}?: 重复n-m次,但尽可能的少重复
    {0,} *?: 重复任意次,但尽可能的少重复
    {1,} a.+?b: 匹配以a开始b结束的最短组合
    {0,1} ??: 重复0次或1次,但尽可能的少重复
  • [] 字符集合
    方括号中任意一个元素(特殊字符中仅有转义字符\保持其特殊含义,^仅在开头位置才表示取反)
    如果要求匹配]则必须将]号置于[]内第1个元素的位置,或使用\]
    如果要求匹配-则要求其在最后或最前的位置,或使用\-
    []也可嵌套使用!

分组

(?:exp0): 匹配exp0,不捕获匹配的文本,不给此分组分配组号. Matches()中没有
(?<name>exp0): 匹配字表达式exp0所代表的字符,并放到组名为name的组里;引用时: \k<name>\k{name}
/\v(%(one|two)three): ex中,不给里面的括号分配分组,而是给外层的括号分配默认分组\1

零宽断言

  • 某个字符串出现了,但不想匹配他
    exp0(?=exp): 查找exp前面的exp0
    (?<=exp)exp0: 查找exp后面的exp0
  • 某个字符串未出现,且不想匹配他: negative-zero-width
    exp0(?!exp): 查找后面不是exp的exp0
    (?<!exp)exp0: 查找前面不是exp的exp0
  • demos
    /\v"\zs[^"]+\ze": ex中(vim),匹配引号内的内容

栗子

  • 反向查找
    ^(?!.*(hello|baidu).*).*$:
  • 非零开头的最多带两位小数的数字
    ^[1-9]([0-9]*)+(.[0-9]{1,2})?$
  • 中文(包括繁体); 注意:不包含很多冷僻字,词库仅2w多个!
    ^[\u4e00-\u9fff]+$
    ^[a-zA-Z0-9\u4e00-\u9fa5]+$"
  • 非打印特殊字符
    [\u0000-\u0001F]
  • email
    ^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
  • 密码
    ^[a-zA-Z0-9_-]{6,18}$
    ^[\w-]{6,18}$
  • 电话号码 (010)88886666022-22334455
    \(0\d{2}\)\d{8}|0\d{2}-\d{8}
  • 身份证
    ^([0-9]){7,18}(x|X)?$
  • IP地址
    (\d{1,3}\.){3}\d{1,3}
  • date
    ^d{4}-d{1,2}-d{1,2}
  • url
    [a-zA-z]+://[^s]*
  • username
    字母开头,5-16字节,字母数字下划线
    ^[a-zA-Z][a-zA-Z0-9]{4,15}$
  • password
    字母开头,6-18个字符 ^[a-zA-Z]w{5,17}$
  • 重复的单词
    b(\w+)\b\s+\1\b
  • 空行
    注意: Editplus正则中,空格是空行的一个组成部分
    ^[ ]*\n