正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
jinnan+o
可以匹配jinnano 或者jinnannano 或者 jinnannanjinnanjino
+号代表前面的字符至少出现一次
jinnan * o
代表前面的字符可以不出现,或一次,或多次
可能会出现 jino jinnano jinnanooooo
+与* 的区别就在于前者是+号之前的全部字符需要完整的出现一次才可以,后者只要有前面的字符出现就行,不一定完整
jinna?n 可以匹配 jinnan jinan
?代表前面的字符最多只能出现一次
像jinna? 最多出现2个n、1个j、1个i、1个a。
普通字符
**[ABC] 匹配[…]里的所偶字符
[jin]
jinnan
匹配jin字符
[ ^ABC]匹配除了[…]里的所有内容
[jin]
jinnan
匹配nan字符
[A-Z]表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母
[A-Z]
JinNan
匹配JN
**[a-z]
JinNan
匹配inan
. 匹配除换行符(/n /r)之外的任何单个字符,相当于[ ^/n/r]
[ \s\S] 匹配所有。
\s 是匹配所有空白符,包括换行
\S 非空白符,不包括换行
\w 匹配字母、数字、下划线
等价于[A-Za-z0-9_]
非打印字符
\x0是一个字符,\代表转义,x0代表这是一个16进制数,
\cx
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f 匹配一个换页符
等价于\x0c 和\cL
\ x0c 是一个 表单Feed ;它迫使打印机移动到下一张纸
\n 匹配一个换行符
等价于\x0a 和\cJ
\r 匹配一个回车符
等价于\x0d 和\cM
\s 匹配任何空白字符,包括空格,制表符,换页符等等。
等价于[ \f\n\r\t\v]
\S 匹配任何非空白字符
等价于[ ^ \f\n\r\t\v]
\t 匹配一个制表符
等价于 \x09 和\cl
\v 匹配一个垂直制表符
等价于\x0b 和\cK
特殊字符
要匹配特殊字符,前面要加\
例如
** \[
\.
\?**
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
’ '表示前面的子表达式零次或者多次*
jinnan* 能匹配j 以及jin
+表示前面匹配的子表
达式一次或者多次
jinnan+ 能匹配jinnannan jinnanjin
但是不能匹配jinna
少一个字符都不行
?表示前面的子表达式零次或者一次
例如
jin(nan)?
可以匹配jin
可以匹配jinnan中的jinnan
可以匹配jinsile中的jin
{n} n是一个非负整数,匹配确定的n次
例如n{3}不能匹配jin
但是可以匹配jinnan
代表n要出现3次,也只能是3次
{n,} n是一个非负整数,至少匹配n次
例如n{3}不能匹配jin
但是可以匹配jinnan,或者jinnannnnnnnn
{n,m} nm均为非负整数,其中n<=m 。最少匹配n次且最多匹配m次
例如n{3,4} 不能匹配jin
但是可以匹配jinnan,jinnann,或者匹配jinnnan
选择
用圆括号()将所有选择项括起来,相邻的选择项之间用|分割。
()表示捕获分组,()会把每个分组里的匹配的值保存起来,多个匹配值可以通过数字n来查看(n是一个数字,表示第n个捕获的内容)
([1-9])([a-z]+)
匹配以一个数字开头多个字母结尾
例如123456jinnan123jinnan456
匹配
6jinnan 和3jinnan
但是圆括号的相关匹配会被缓存,此时可用?:
放在第一个选项前来消除这种副作用。
?:、?=、?! 这三个是非捕获元
后两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
特殊用法:
A(?!B)
查找后面不是B的A
(?<=B)A
查找B后面的A
A(?=B)
查找B前面的A
(?<! B)A
查找前面不是B的A