元字符
量词
字符类
分支条件
反义
分组
后向引用
零宽断言
负向零宽断言
注释
贪婪与懒惰
处理选项
平衡组/递归匹配
其它
元字符 (匹配单个字符)
. 单行内任意字符(不匹配换行符)
\w 字母 or 数字 or 下划线 or 汉字
\s 空白符
\d 数字
\b 匹配位置—单词的开始或结束
^ 匹配位置-字符串的开始
$ 匹配位置-字符串的结束
量词
任意数次
至少一次或更多
? 最多一次或零次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
字符类 (匹配单个字符)
[ ] 表示匹配[]内字符中的一个
分支条件
从左至右,满足规则中任意一种都匹配,不同的规则用“|”分隔开
\d{5}-\d{4}|\d{5}
反义
\W 非(字母、数字、下划线、汉字)
\S 非空白符
\D 非数字
\B 非单词开头或结束的位置
[^x] 非x的任意字符
[^aeiou] 非(aeiou)的任意字符
例子: \S+ 匹配不包含空白符的字符串。
<a[^>]+> 匹配用尖括号括起来的以a开头的字符串。
分组
捕获分组:( ),分组会被自动捕获以便程序作进一步处理
默认组号:每个分组默认拥有一个组号,从左至右,第一个分组组号为1,第二个为2
指定组名:为(\w+)子表达式指定组名:(?<组名>\w+) or (?’组名’\w+))
匹配IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
注:IP地址中数字不大于255,可以包含前导 0
*常用分组语法:
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
零宽断言
零宽度正预测先行断言 (?=exp) 此位置后面跟exp匹配 \b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
零宽度正回顾后发断言 (?<=exp) 此位置前面跟exp匹配 (?<=\bre)\w+\b 匹配以re开头的单词的后半部分(除了re以外的部分)
零宽度负预测先行断言 (?!exp) 此位置后面不跟exp匹配 \d{3}(?!\d) 匹配后面不能是数字的三位数字
零宽度负回顾后发断言 (?<!exp) 此位置前面不跟exp匹配 (?<![a-z])\d{7} 匹配前面不是小写字母的七位数字
后向引用
\1 \b(\w+)\b\s+\1\b \1 表示(\w+)分组捕获的内容
\k<组名> \b(?<组名>\w+)\b\s+\k<组名>\b
零断宽言 (用于指定一个位置)
查找在某些内容之前或之后的位置,这个位置将满足某些条件(即断言)
负向零断宽言 (反义)
注释
贪婪与懒惰
贪婪匹配
懒惰匹配
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
处理选项 (常用的正则表达式选项)
平衡组/递归匹配
(?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
(?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
匹配嵌套的<div>标签: <div[>]*>[<>](((?'Open'<div[^>]>)[<>]*)+((?'-Open'</div>)[<>])+)(?(Open)(?!))</div>.
其它
\a 报警字符(打印它的效果是电脑嘀一声)
\b 通常是单词分界位置,但如果在字符类里使用代表退格
\t 制表符,Tab
\r 回车
\v 竖向制表符
\f 换页符
\n 换行符
\e Escape
\0nn ASCII代码中八进制代码为nn的字符
\xnn ASCII代码中十六进制代码为nn的字符
\unnnn Unicode代码中十六进制代码为nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开头(类似^,但不受处理多行选项的影响)
\Z 字符串结尾或行尾(不受处理多行选项的影响)
\z 字符串结尾(类似$,但不受处理多行选项的影响)
\G 当前搜索的开头
\p{name} Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp) 贪婪子表达式
(?<x>-<y>exp) 平衡组
(?im-nsx:exp) 在子表达式exp中改变处理选项
(?im-nsx) 为表达式后面的部分改变处理选项
(?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes) 同上,只是使用空表达式作为no
(?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes) 同上,只是使用空表达式作为no
replace(//,function(a,b,c,d){})
replace 第二个参数为函数
函数参数的规定:
- 第一个参数为每次匹配的全文本($&)。
- 中间参数为子表达式匹配字符串,个数不限.( $i (i:1-99))
- 倒数第二个参数为匹配文本字符串的匹配下标位置。
- 最后一个参数表示字符串本身。