一、什么是正则表达式?
1.定义:
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
2.组成:
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
3.何时使用:验证——从头到尾完整匹配!
查找——只要部分匹配即可!
二、正则表达式的基本语法和规则
1.备选字符集:规定某*一位字符*可用的备选字符的集合
语法:[可选字符列表]
强调:1. 无论备选字符集包含多少字符,只能选1个
2. 必须选1个!
比如:6位数字的密码
[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
简化:1. 当备选字符连续时,可用-表示范围的区间
比如:[0123456789]-->[0-9]
[0-9][0-9][0-9][0-9][0-9][0-9]
[a-z]-->1位小写字母
[A-Z]-->1位大写字母
[A-Za-z]-->1位字母,大小写都行
[0-9a-zA-Z]-->1位字母或数字都行
反选:[^不能选的字符列表]
比如:[^47] 强调:^作“除了”使用时,只能放在开头
2. 预定义字符集:为常用的字符集专门提供的简化写法!
“\d”-->[0-9]-->1位数字
“\w”-->[0-9a-zA-Z_]-->1位字母,数字或_
“\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
“ . “: 除换行回车外的任何一个字符,如:
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.{3}$":表示有任意三个字符的字符串(长度为3个字符)
\t--------匹配一个制表符
预定义字符的反义:预定义字符的大写形式都是小写的反义
\D---->1位非数字字符
\S------匹配任何非空白字符。等价于 [^\f\n\r\t\v]。
\v------匹配一个垂直制表符
\n------匹配一个换行符
\r-------匹配一个回车符
3. 数量词:规定相邻的字符集可出现的次数
确定数量:3种:
{n}--> 必须反复出现n位
{n,m}--> 最少出现n次,最多出现m次
{n,}-->至少出现n次,多了不限!
比如:/^\d{6}$/——6位数字
手机号规则:
第1位:只能是1
第2位:[34578]
第3位之后,必须是9位数字
手机号:/^1[34578]\d{9}$/
不确定数量:3种:
*: 有没有都行,次数不限,相当于{0,}
+: 至少1次,重复次数不限,相当于{1,}
?: 有没有都行,最多1次,相当于{0,1}
():分组
|: 左右两正则表达式选其一
身份证号逻辑:
前15位数字
16,17位必须是数字
最后一位可以是数字或X x
后三位 可有可无,如果有,只能出现一次
\d{15}(\d\d[0-9Xx])?
手机号:
手机号前可能出现+86或0086。
前缀可有可无,且只能出现一次
前缀和手机号之间可以有或没有任意个空字符
第1位:只能是1
第2位:[34578]
第3位之后,必须是9位数字
手机号:
(\+86|0086)?\s*1[34578]\d{9}
4. 指定匹配位置:
^表达式: 必须以表达式的规则为开头
表达式$: 必须以表达式的规则为结尾
比如:选择字符串开头的空格?^\s*
选择结尾空格?\s*$
选择开头或结尾的空格?^\s*|\s*$
*预告:今后只要在程序中执行验证:都要前加^后加$*
表示从头到尾完整匹配。
比如:test():
^\d{6}$——从头到尾必须只能是6位数字
1234567
5. 预判:在正式匹配正则表达式之前,先预读整个字符串,进行初步匹配,如果预判都未通过,则不再验证!
1)(?=表达式): 先浏览字符串是否满足表达式的要求
何时使用:只要正则中出现类似"而且"
比如:4位数字,但不能包含4和7
(?=[^47]$) 是否由除了4,7之外的字符组成
2)(?!表达式):先检查字符串是否不满足表达式要求
比如:6位以上密码。
字母,数字组成
首字母不能是数字: [a-zA-Z][a-zA-Z0-9]{5,}
必须至少包含1个大写字母
不能都由小写字母和数字组成: (?![a-z0-9]+$)
必须至少包含1个数字
不能都由小写字母和大写字母组成:
(?![a-zA-Z]+$)
6.特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 (\) 放在它们前面。下面列出了正则表达式中的特殊字符:(请注意在方括号中,不需要转义字符。)
“$”------匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
“()”----标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
“*”----匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
“+”-----匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
“.”----匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \.。
“[”------标记一个中括号表达式的开始。要匹配 [,请使用 \[。
“?”----匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
“\”----将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "(".
“^”-----匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
“{”----标记限定符表达式的开始。要匹配 {,请使用 \{。
“|”----指明两项之间的一个选择。要匹配 |,请使用 \|。
7. 贪婪模式和懒惰模式:
贪婪模式:默认情况下,正则表达式会匹配最大的符合条件的字符串, *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
贪婪模式原因:(.*) (.+)
懒惰模式:正则表达式仅匹配最小的符合规则的字符串
比如:筛选网页中的a元素:
<a\s+(.*)href\s*=\s*["']([^'"]*)["']
贪婪模式-->懒惰模式:.*?
例如:
您可能搜索 HTML 文档,以查找括在 H1 标记内的章节标题。该文本在您的文档中如下:
<h1> Chapter 1 - Introduction to Regular Expression</h1>
下面的表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
如果您只需要匹配开始 H1 标记,下面的"非贪心"表达式只匹配 <H1>。
/<.*?>/
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪心"表达式转换为"非贪心"表达式或者最小匹配。