正则对我来说,真的是感觉超级难得,但是做我们程序媛的嘛,再难也要去好好攻克,理解中心思想最要紧的啦~~
正则表达式的三个知识点,这就叫“磨刀不误砍柴工”:
1)匹配位置
2)匹配字符串
3)表达式中的括号
首先,请记住,正则表达式的匹配要点:
正则是匹配模式,要么匹配位置,要么匹配字符
正则是匹配模式,要么匹配位置,要么匹配字符
正则是匹配模式,要么匹配位置,要么匹配字符
推荐练习正则的工具链接: regex101.com/
首先熟悉一下正则表达式的一些字符:
- 限定符 ?: 官方解释:代表 限定符 ? 前面出现的这个字符需要出现0次或者1次。
我个人理解为模糊匹配,比如 use 和 used 我们在用 限定符?匹配的时候可以 写表达式 /used? 那我们查询出来的结果 既会有 use 也会有used。
- 限定符 * 官方:它回去匹配0个或这个字符
个人理解:在需要查询的位置写入限定符*,就意味着,被查询的数据里,带有一个或者多个这个字符的数据,都会被查询出来,在下面这个示例中,字符中的c可以没有,也可以出现多次 但如果字符中间出现了c除外的情况其他字符,比如 adc addc 那么是不会被查找到的
- 限定符 + 官方:匹配出现一次以上的字符, 个人理解:是比限定符*,更加精准的匹配,比如 /ac+b,这种情况会匹配出出现了字符c一次以上的,如果没有c出现的就不会被匹配到
如果,想要更加精准匹配的话,可以加上字符出现的次数,/ac{6}b,这个表达式的意思是,字符c出现在a和b中间 了6次的数据
如果在匹配的时候,要匹配的字符需要查询某个区间范围的数据,可以在{}字符中,写上范围。比如/ac{2,6}b,匹配的结果是 在有2个到6个之间的所有数据都会被匹配出来
如果,我们在匹配的时候,只要这个字符出现的次数大于或等于2 的时候,我们可以/ac{2,}b 注意 逗号是不可以省略的
- “或” | 运算符 表示要么有a 要么有b,要么a和b都有,像示例中的 a cat 和 a dog ,
表达式为a (dog|cat),意思是要么a 后面跟着dog 要么跟着cat 注意 ()是一定要存在的,不能省略或者不写
- 字符类 [] []中的内容代表要求匹配的字符只能取自于它们 [abc]意思是匹配所有包含a或者b或者c或者abc的数据
[]可在方括号中指定范围, 比如[a-z],指的是匹配包含a-z之间的所有小写字母的英文字符
[a-zA-Z],指的是匹配包含所有英文字母的数据,不论大小写
[a-zA-Z0-9],指的是匹配包含所有的大小写英文字母和数字的字符
注意 ^ 尖号:要求匹配除了尖号后面列出的【以外】的字符
[^0-9],这个表达式的意思是,要求匹配所有非数字的字符(不是数据就行)
- 元字符:大多数元字符均是以\反斜杠开头 \d:代表数字字符 等同于[0-9]
\D:代表非数字字符
\w:代表“单词”字符,也就是所有的英文字符数字加下划线
\W:代表非“单词”字符
\s:代表空白符(包含Tab和换行符)
\S:代表非空白字符
- 特殊字符
句点. :是一个特殊字符 代表任意字符,但不包含换行符
尖号^:会匹配行首
美元符$:会匹配行尾
哇哦,期待已久的正则表达式中的一些“高级概念”
需求:要求我们只匹配<>尖括号里面的内容 “贪婪匹配”:<.+>
懒惰匹配——按需匹配:<.+?> 那只要多加个?问号,就能匹配到我们想要的啦~~
看一下实例吧~~~
1.RGB颜色匹配
RGB颜色均是十六进制的
/^#[a-fA-F0-9]{6}\b/ 解释一下这个表达式的意思:
首先匹配开头的#井号,而^尖号匹配行首
[a-fA-F0-9],中括号里面的均是满足匹配的条件
- a-f是指满足包含小写英文a-f的字符;
- A-F是指满足包含大写英文A-F的字符;
- 0-9是指满足包含所有数字的字符;
{6};明确匹配范围,颜色通常为6位代码
\b:在表达式的中是表达单词字符的边界,为了避免匹配的时候不符合要求的文本也会被匹配上
2. IP地址的匹配
首先了解到ipv4的地址是由四段数字构成的,数字之间由英文句点.隔开
表达式:/^\d+.\d+.\d+.\d+$/
\d+:会匹配任何长度大于1的数字
.:代表句点.这个字面量,句点这个符号是元字符,代表任意字符 因为在正则表达式中是一个特殊符号,所以在这里用\反斜杠做转译 转译成单纯的小数点
写到这里为止,我们看到上面的示例图,需要思考一个问题就是,我们知道IP地址的每个部分都是8位的数字,也就是说这个范围是在0-255之间,显然我们匹配的256.168.0.4已经超出了这个范围,但是仍然被匹配成功了
那我们需要进一步改良再进行匹配的话可以换一个思路,
-
如果它的前两位是25 那它的第三位就是[0-5]
-
如果第一位是2,第二位是[0-4],那么最后一位可以取[0-9]间的任意数字
-
如果第一位是01,那么后两位可以取[00-99]之间的任意数字
-
但我们也清楚,IP地址的每一部分也可以是两位数构成,甚至是1位,因此我们可以直接将这里的第一个数字和第三个数字的后面加一个限定符 ? ,就可以表示我们说的当前这种情况了
-
这一步,我们匹配句点,将前面的所有表达式用括号(),括起来,这一段,我们要求重复匹配三次,这样正则表达式会去匹配IP地址的前三段,并且包含每段后面的句点,而至于第四段数字,我们只需要将匹配第一段数字的这一部分复制过来即可
-
最后,我们在首尾都加上\d来匹配字符的边界
表达式: /\b((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b/