ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
因为小宝鸽正则表达式用得不多,一般也就网上找找js验证手机号、邮箱、qq、身份证号码的正则表达式,然后使用。那些正则表达式,看着似懂非懂的样子,始终存在一些疑问,几番想系统学习一下正则表达式,但是那些疑惑就像修仙大道的心结,让我正则表达式水平毫无存进。最近刚好有这样的时间把这些问题弄明白,并且对正则表达式有了入门的理解。 ### (1)为什么很多JavaScript正则表达式串都是以“/”开头并且以“/”结尾? 其实这是一种正则表达式的隐式构造方式. 在JavaScript里面,一般有两种构造方式 1、用两斜杠将正则表达式夹在中间。  例:var reg = /\w+/; 2、使用new来创建。  例:var reg = new RegExp(“\\w+”);  注意:这里的\\w是双斜杠,因为\本来就是字符串的转义字符,这里就经过了两次转义了。 第二种是正则对象的显式构造方法。 因此,如果你采用显式构造方法一定记得把前后的/去掉哦,不然,哼。 ### (2)为什么很多JavaScript正则表达式串都用^和$包含着正则表达式串 因为^ 和 $ 语言元素与输入字符串的开头和结尾匹配。  ^表示必须以什么开头  $表示必须以什么结尾 ^表示必须以什么开头,这个好理解,关于$我们看下面的例子: 如我们想匹配以1开头,后面跟着10数字(类似与手机号的弱验证)  那么我们正则表达式串可以这样:^[1][\d]{10}$  如果我们校验字符串为:  14564564564564654654654564654 //不匹配  14564564564 //匹配 如果我们把正则表达式最后面的$去掉:^[1][\d]{10},  结果是这样:  14564564564564654654654564654 //匹配  14564564564 //匹配 如图: ![](https://box.kancloud.cn/2016-03-15_56e77db7091b8.jpg) ![](https://box.kancloud.cn/2016-03-15_56e77db71c5d6.jpg) ![](https://box.kancloud.cn/2016-03-15_56e77db732bdb.jpg) ### (3)正则表达式除了用来验证下手机号码、身份证号码,还能干什么? 正则表达式的用途 1、数据验证,例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 2、替换文本,可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 3、基于模式匹配从字符串中提取子字符串,可以查找文档内或输入域内特定的文本。 关于,数据验证,没什么好说的,就是平时那些js验证手机号啊,邮箱啊什么的,这里就不说了。 下面关于提取子字符串和替换文本,我们以Java为例,为什么是Java?谁让Java是世界上最好的语言呢!是它,就是它,咳咳,客观请看: ~~~ import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestRegex { public static void main(String[] args) { //把 第“数字"条 全部查找出来然后换成 小宝鸽 String regex = "第[0-9]*条"; String str = "第9条,数据错误,错误信息,第jjj哦条哦条我的条件如何?第221条xx"; System.out.println(str); Pattern pat = Pattern.compile(regex); Matcher matcher = pat.matcher(str); while (matcher.find()) { String temp = str.substring(matcher.start(), matcher.end()); str = str.replaceAll(temp, "小宝鸽"); } System.out.println(str); //直接替换了 str = "第9条,数据错误,错误信息,第jjj哦条哦条我的条件如何?第221条xx"; System.out.println(str); str = str.replaceAll(regex, "小宝鸽"); System.out.println(str); } } ~~~ 提取子字符串和替换文本的例子都在上面的例子代码里面体现啦 运行结果: ![](https://box.kancloud.cn/2016-03-15_56e77db74f819.jpg) ### (4)正则表达式内容不少,想要短时间全部掌握不可能,入门需要学习哪些呢? 下面,我们先简单了解下这些语法:  字符匹配: | 字符 | 描述 | | :-- | :-- | | \d | 匹配数字(0~9) | | \D | 匹配非数字 | | \w | 匹配任意单字符 | | \W | 匹配非单字符 | | \s | 匹配空白字符 | | \S | 匹配非空字符 | | . | 匹配除换行符 \n之外的任何单字符。 | | […] | 匹配括号中任意字符 | | [^…] | 匹配非括号字符 | 重复匹配: | 字符 | 描述 | | :-- | :-- | | {n} | 匹配n次字符 | | {n,} | 匹配n次和n次以上 | | {n,m} | 匹配n次上m次下 | | ? | 匹配0或1次 | | + | 匹配一次或多次 | | * | 匹配0次以上 | | 指明两项之间的一个选择。要匹配 |,请使用 \| | 字符定位: | 字符 | 描述 | | :-- | :-- | | ^ | 定位后面模式开始位置 | | $ | 前面模式位于字符串末端 | | \A | 前面模式开始位置 | | \z | 前面模式结束位置 | | \Z | 前面模式结束位置(换行前) | | \b | 匹配一个单词边界 | | \B | 匹配一个非单词边界 | 转义匹配: | 字符 | 描述 | | :-- | :-- | | “\”+实际字符 | \ . * + ? ( ) { }^ $ | | \n | 匹配换行 | | \r | 匹配回车 | | \t | 匹配水平制表符 | | \v | 匹配垂直制表符 | | \f | 匹配换页 | | \nnn | 匹配一个8进制ASCII | | \xnn | 匹配一个16进制ASCII | | \unnnn | 匹配4个16进制的Uniode | | \c+大写字母 | 匹配Ctrl-大写字母 | 上面的语法来自于博文:[http://www.cnblogs.com/moss_tan_jun/archive/2010/08/15/1800281.html](http://www.cnblogs.com/moss_tan_jun/archive/2010/08/15/1800281.html) 上面的语法可能有些比较抽象,没有看懂并没有关系,日后用到在逐个研究。 了解了上面的语法之后我们来看看这些例子: 让我们开始第一个验证,输入的字符在a-g之间? ~~~ [a-g] ~~~ 输入的字符在a-g之间并且长度为3? ~~~ [a-g]{3} ~~~ 输入的字符在a-g之间并且最大长度为3最小长度为1? ~~~ [a-g]{1,3} ~~~ 我如何在匹配像91230456, 01237648那样的固定8位数? ~~~ ^[0-9]{8}$ ~~~ 验证像INV190203 或 inv820830那样的前3位是不区分大小写的英文字母,剩余8位是数字 在前面的表达式中只能匹配前3个是小写英文字母的发票编号,如果我们输入大写字母那就不能匹配了。所以为了确保前3个字母是不区分大小写的,我们就要用表达式^[a-zA-Z]{3}。 完整的正则式如下: ~~~ ^[a-zA-Z]{3}[0-9]{7}$ ~~~ 我们可以验证简单的网址URL格式吗? 第一步:检查是否存在www: ~~~ ^www. ~~~ 第二步:域名必须是长度在1-15的英文字母: ~~~ .[a-z]{1,15} ~~~ 第三部:以.com或者.org结束: ~~~ .(com|org)$ ~~~ 完整的表达式如下: ~~~ ^www[.][a-z]{1,15}[.](com|org)$ ~~~ 让我们在来看看BCD(其实也就是上面说的3条基本语法)如何验证email格式 第一步:email开始是长度在1-10的英文字母,最后跟一个”@”: ~~~ ^[a-zA-Z0-9]{1,10}@ ~~~ 第二步:@后面是长度在1-10的英文字母,后面跟一个”.”: ~~~ [a-zA-Z]{1,10}. ~~~ 第三步:最后以.com或.org结束: ~~~ .(com|org)$ ~~~ 最后完整的表达式如下: ~~~ ^[a-zA-Z0-9]{1,10}@[a-zA-Z]{1,10}.(com|org)$ ~~~ 以上正则例子出自博文:[http://www.cnblogs.com/sxwgf/archive/2011/11/17/2252076.html](http://www.cnblogs.com/sxwgf/archive/2011/11/17/2252076.html),该博文还有日期验证的例子。 上面的一些例子可能看官们能看到懂,但是自己不动手试试,还是不放心,因此下面推荐两个在线测试正则表达式网站,可以验证上面的例子! 正则表达式在线测试网站,这两个网站都可以,挺好用的,但是个人还是推荐前者(虽然界面没有那么美观):  [http://tool.chinaz.com/regex/](http://tool.chinaz.com/regex/)  [http://tool.oschina.net/regex/](http://tool.oschina.net/regex/) 博主的正则表达式只是入门,如果上文有任何不正确的地方望评论纠正,不胜感激!