字符匹配
- 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。
- 元字符:元字符具有特殊的含义,例如 \d \w
量词
1、+号 匹配前面的模式1次或多次
加号表明前面的字符可以出现1次或多次,但必须至少出现1次。如果该字符没有出现,那么模式就不会匹配。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个
2、?号 匹配前面的模式0次或1次
问号表明前面的字符可以出现0次或1次,但只限于此。它不会匹配多次出现的字符。
3、* 星号 通配符 匹配前面的模式0次或多次 可以复制它之前那个字符任意次数,包括0次,即[0, +∞]次。
在正则表达式中,星号(*)是一个量词,用于指定前面的表达式可以重复出现零次或多次。它表示前面的表达式可以出现任意次数,包括零次。
例如,正则表达式 a* 表示匹配零个或多个连续的字母 "a"。下面是一些匹配的示例:
- "a":匹配一个 "a"。
- "aa":匹配两个连续的 "a"。
- "aaa":匹配三个连续的 "a"。
- "b":不匹配,因为没有 "a"。
另一个常见的量词是加号(+),它表示前面的表达式可以重复出现一次或多次。与星号不同,加号要求至少有一个匹配项。
4、 . 点(又称dot) 通配符 匹配一个任意字符,仅1次。
匹配除换行符(\n 换行符、\r 回车符)之外的任何单个字符,相等于 [^\n\r]
在正则表达式中dot几乎匹配任意一个字符,但是不匹配换行符\n
5、{} 花括号 为正则表达式指定最大重复次数或最小重复次数或者重复次数在多少至多少之间
ERE中的花括号允许为可重复的正则表达式指定一个上限。这通常称为间隔(interval)。
- {n}:匹配前面的模式恰好 n 次。
- {n,}:匹配前面的模式至少 n 次
- {n,m}:匹配前面的模式至少 n 次且不超过 m 次
这个特性可以精确调整字符或字符集在模式中具体出现的次数。
实例
我们在写用户注册表单时,只允许用户名包含字符、数字、下划线和连接字符 -,并设置用户名的长度,我们就可以使用以下正则表达式来设定。
正确理解通配符 . 和通配符 *
举例1:
模式串P:.a*m
文本串S:zaaam
匹配结果:成功
原因:P的.匹配S的z,
P的*复制了3次P的a 去匹配了S的3个a,
P的m匹配了S的m
举例2:
模式串P:.a*m
文本串S:cm
匹配结果:成功
原因:P的 . 匹配S的c,
P的 * 复制了0次P的a (相当于a被 * 消除了)
P的m匹配了S的m
举例3:
模式串P:a.a
文本串S:aaa
匹配结果:成功
原因:P的a匹配S的a,
P的 . 匹配了S的a
P的a匹配了S的a
举例4:
模式串P:am*ac*a
文本串S:aaa
匹配结果:成功
原因:
P的a匹配S的a,
P的 * 复制了0次P的m(消除m)
P的a匹配了S的a
P的 * 复制了0次P的c(消除c)
P的a匹配了S的a
举例5:
模式串P:aa.a
文本串S:amna
匹配结果:失败
原因:
第一步P的a匹配S的a虽然是成功的,
但是第二步P的a必须只能匹配S的m ,因为它后边是 .
而a不等于m,所以匹配失败了。
最牛的是下方这个:.* 星号复制了无数个点(即任意字符,除了\r \n),那这个组合不就可以匹配任意长度的任意字符串,即任意字符
举例6:
模式串P:.*
文本串S:随便什么文本
匹配结果:成功
原因:
P的可以复制任意个P的.来匹配S串,因为一个.可以匹配一个任意字符,
比如模式串.可以匹配文本串a或m或c,而.是P中的复制了1个.而来的。
比如模式串..可以匹配文本串ab或mc或cc,而..是P中的复制了2个.而来的。
比如模式串...可以匹配文本串aaa或amc或acc,而...是P中的复制了3个.而来的。
比如模式串....可以匹配文本串aaaa或amcd或accd,而....是P中的*复制了4个.而来的。
边界匹配
1、 ^ 上三角号 两种情况 大多用于匹配开头字符 开始标记
① 例:^dog 匹配以 "dog" 开始
② 在中括号"[]" 中被使用的话,就是表示字符类的否定,在这个字符集中不包含,例:[^*@#],排除 *、@ 、# 三个特色符号
2、$ 美元符 匹配结尾字符 结束标记
abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置,例:dog$,匹配以 "dog" 结尾
3、\b:匹配单词边界
4、\B:匹配非单词边界
字符类
- [ ]:匹配中括号内的任意一个字符。例如,[abc] 匹配字符 "a"、"b" 或 "c"。
- [^ ]:匹配除了中括号内的字符以外的任意一个字符。例如,[^abc] 匹配除了字符 "a"、"b" 或 "c" 以外的任意字符。
特殊字符
1、\ 转义字符,用于匹配特殊字符本身
2、 - 中划线 在中间放的中划线会被识别为连接符,表示一个范围
正则表达式里"-"中划线的使用注意
实例
今天要匹配正则表达式,把非法的字符找出来,开始的写法是这个
[^A-Za-z0-9_.*-+%!],我的目的是把_.*-+%!这7个字符算合法字符,但是发现有许多其他字符也合法了,原来是中划线的位置不对,应该这样写
[^A-Za-z0-9_.*+%!-],在中间放的中划线会被识别为连接符,表示一个范围。
3、| 管道符 或者 用于指定多个模式的选择
管道符号允许在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模式。如果任何一个模式匹配了数据流文本,文本就通过测试。如果没有模式匹配,则数据流文本匹配失败。
4、[\s\S] \s 是匹配所有空白符,包括换行;\S 非空白符,不包括换行。
/[\s\S]/g 匹配所有
/[\s]/g 匹配所有空白符,包括换行
5、\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
6、\d 匹配一个数字字符。等价于 [0-9]。
7、\D 匹配一个非数字字符。等价于 [^0-9]。
分组匹配和捕获
1、() 小括号 分组,该组被视为一个标准字符 标记一个子表达式的开始和结束位置 用于分组和捕获子表达式
正则表达式模式也可以用圆括号进行分组。当将正则表达式模式分组时,该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符。
2、( ?: ) 用于分组但不捕获子表达式
但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用
3、非捕获元
① ?: 是非捕获元,表示不捕获子表达式
② ?= 也是非捕获元,为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
③ ?! 也是非捕获元,负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串
4、[] 中括号
在正则表达式中,方括号 [] 是用于定义字符集合的元字符。它在正则表达式中有以下作用:
- 匹配字符集合中的任意一个字符:方括号中列出的字符,表示在这个位置可以匹配这些字符中的任意一个。例如,[abc] 将匹配任意一个字符是 “a”、“b” 或 “c” 的位置。
- 指定字符范围:可以使用连字符 - 来指定字符的范围。例如,[0-9] 表示匹配任意一个数字字符,等同于 \d。
- 否定字符集合:在方括号的开头使用 ^ 符号,可以表示否定字符集合。例如,[^0-9] 表示匹配任意一个非数字字符。
- 转义特殊字符:在方括号内,一些特殊字符如 ^, -, ], \ 等可以直接使用,不需要进行转义。
以下列出下列符号的使用区别
1、 exp1(?= exp2) 查找后面是 exp2 的 exp1
2、 查找前面是 exp2 的 exp1
3、查找前面不是 exp2 的 exp1
4、 exp1(?! exp2) 查找后面不是 exp2 的 exp1