正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
相信做后台的一定经常会碰到,用正则表达式匹配某个字符是否符合规则
例如 我们要搜索字符中是否含有’shop’这个字符串
正则表达式为/shop/
那个这个表达式是按照什么样的规则来实现的呢?
分隔符
首先我们介绍一下'/'
的作用,他是一个分隔符,当然你可以选择任何非字母、数字、‘\’或空格的字符来作为分隔符,只是最常见的做法是'/'
。
如果你要在正则表达式里面用'/'
你可以在它前面加上转义字符'\'
。
例如:
/http:\/\//
用来匹配我们这里匹配我们的http://
字符,我们这里用’\’来转义我们的’/’
字符类和类型
使用我们的字符集合可以使得正则表达式的能力立即超过精确匹配表达式的能力。
例如:我们想查询 以’at’结尾的三个字母组成的单词。我们可以编写正则表达式如下
/.at/
我们这里的.
就代表匹配一个除了\n
的通配符。 可以匹配cat mat sat dat
等等字符
但这样的正则也能匹配注#at @at
之类的字符。这时我们就要限制第一个字符为a-z或者A-Z
我们可以这样写/[a-z]at/
任何包含在方括号中的内容都是一个字符类。只匹配一个字符(敲黑板 重点)
例如我们/[aeiou]/
就表示匹配一个为元音的字符。
/[a-zA-Z]/ //可以用代表大小写的任意字母
/[^a-z]/ //注意当^在方括号里面时,表示的是除了a-z之外的字符.如在方括号外面则后面的规则在字符串开始匹配
重复
因为[]
只可以匹配一个字符,如果有的时候你希望指定字符或字符类多次出现的时候该怎么办呢?
在这里我们引入了重复的概念
*
表示这个模式可以重复0次或者多次
+
表示这个模式可以重复1次或多次
?
表示这个模式可以出现1次或0次
例如 /[a-zA-Z]+/
表示至少有一个字母
子表达式
把一个表达式分成几个子表达式是有用的,例如,你可以用上面的重复来匹配一个或多个需要匹配的模式。
我们可以用园括号()来表示
例如:
/(very )*large/
因为*表示可以匹配0次或多次 可以匹配“large” “very large” “very very large” 等
子表达式计数
对于上面说的子表达式重复问题,我们还可以用另外一种方式来解决。、
/(very ){1,3}/
我们这里表示可以匹配“very ”,”very very “,”very very very ”
其中“{}”表示指定子表达式允许重复的次数
“{1}”代表重复一次
“{1,3}”代表重复一到三次
“{1,}”未指定最大范围的话 代表至少重复1次
定位到字符串的开始或末尾
定位到字符串开始的符号 ^
,前面讲到的^
不是说这个是取反的意思吗?
对的,当^
这个字符在我们的方括号里时,表达的时取反的意思
但当这个^
在方括号外面是,表达的是从字符串开始匹配
例如: /^bob/
这将在字符串一开始匹配 bob这个字符
定位到字符串开始的符号”$” 和定位到结束符号是一样的。
例如: /bob$/
代表从字符串末尾开始匹配 bob这个字符
/^[a-z]$/
代表,至少两头是a-z的字符串或者字符。
分支
正则表达式可以用|
来表示模式选择。例如,我要匹配com、edu、net 你可以用如下表达式
/com|edu|net/
元字符一览
回溯引用
回溯引用是通过一个反斜杠加上一个数字来表示。它用来匹配多次出现在一个字符串中的相同子表达式。
例如/^([a-z]+) \1 /
可以匹配 “aab aab” 不可以匹配”aab abb”
“([a-z]+)”表示一个或多个字母字符。
“\1” 也就是表示对前面匹配的子表达式的回溯引用,数字代表引用次数。
实战训练
邮箱的实战训练
邮箱的格式为
(字母、数字、下划线、点、连接符构成的字符)@(字母、数字、连字符组成的字符).(字母、数字、点、连接符构成的字符)
我们把邮箱的验证分成5个部分
那么正则表达式我们就该这样写
我们先验证第一个部分
正则:/^[a-zA-Z0-9_\-\.]+/
“+”代表匹配一次或多次。
第二部分
正则:/@/
第三部分
正则: /[a-zA-Z0-9\-]+/
第四部分
正则 /./
第五部分
由于我们要在最后验证该规则,所以要用$符号
正则:/[a-zA-Z0-9\-\.]+$/
所以最后的结果为
/^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+.[a-zA-Z0-9\-\.]+$/