今天在coding的时候,看到师傅写了这样一串的代码:
if (/^([a-f0-9A-F]{2}:){5}[a-f0-9A-F]{2}$/.test(val)) { this.tempdata.name = val.toLowerCase() }
我对这里的.test语法不太理解,然后就有了这一篇文章:
上面的代码主要有两个知识点了,一个就是if判断,另一个就是正则表达式匹配的操作。
正则表达式,英文为regular expression。先说说书上给的定义:
正则表达式是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。
由于我这人阅读理解能力稍微差点,于是总喜欢把这些话进行拆分,然后进行理解。
下面举个例子吧,以下就是一个验证IP地址的一个正则表达式:
/^((2(5[0-5]|[0-4]d))|[0-1]?d{1,2})(.((2(5[0-5]|[0-4]d))|[0-1]?d{1,2})){3}$/
当然,我现在的水平也看不懂这个到死是啥,但是,我知道IP地址一般是这样的形式:如192.168.1.1,这样四个0到255的数字和中间三个小数点组成的。
然后我们把这两个内容进行对照,我们看到,长长的正则表达式里也有一个小数点,我依稀觉得这两个之间绝对是有对应关系的。
于是,回到概念吧,我们发现这个ip地址虽然是由几个数字和小数点组成的,但是它最终写成的还是一个字符串。也就是一些由数字组合起来的文本了。
我是不是可以理解为那个长长的正则表达式应该就是约束实际内容的东西呢?
于是,概念中的给定模式,就是那一串长长的由括号数字等组成的一长串代码吧。
说实话,根据我现在的水平,我是觉得能把上面的正则表达式根据实际的需求写出来还是挺难的。
我就想,按我就先会用吧,毕竟网上现成的正则还挺多的。直接拿来用就好了,原谅我懒。。。
下面说说,正则表达式的新建吧!
和对象的新建相似,新建正则表达式有两种方法。
一种是使用字面量,以斜杠表示开始和结束。
var a = /xyz/;
另一种就是利用RegExp()构造函数来创建RegExp对象,
var a =new RegExp("xyz")
突然感觉两个有点不大对劲。。。
上一篇文章,我使用new操作符和Object创建对象。
var a = new Object();a.name = "sudoudou";
之后提到的,
var obj1 = new Object();var obj2 = new Array();var obj3 = new Date();var obj4 = new RegExp("ys");
为什么var a =new RegExp("xyz")是构造函数,也没见写function代码呀,它不应该是构造函数呀。。。
这几段代码,我好像忽略了,这几个是系统内置的对象。
这里这样写的话,认为是既然已经可以用new关键字了,我们就直接认为这个内置好的对象,已经写过构造函数了。
姑且先这样理解吧,万一错了,之后再改吧,现在就记得这两种定义方式吧!
再强调一次
var a = /xyz/;var b = new RegExp("xyz")
一般来说,我们基本上都采用字面量定义正则表达式。
可是我们为什么要用正则表达式呢?
- 测试字符串内模式,比如测试电话号码是否符合规则可以成为数据验证,
- 替换文本,可以使用正则表达式识别文档中的特定文本,完全删除或者使用其他文本替换它。
- 基于模式匹配从字符串中提取字符串。
看完内容,我发现最上方的代码正好是解决第二条功能的。如果是mac地址形式的内容,就把全部内容转小写。
RegExp构造函数还可以接受第二个参数,表示修饰符
var regex = new RegExp('xyz', 'i');// 等价于var regex = /xyz/i;
常用的几个修饰符
i 不区分(ignore)大小写;
例如: /abc/i 可以匹配 abc、aBC、Abc
g 全局(global)匹配
如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回
如果带g,则字符串从左到右,找到每个符合条件的都记录下来,知道字符串结尾位置
m 多(more)行匹配
若存在换行并且有开始^或结束$符的情况下,和g一起使用实现全局匹配,
因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,
g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始
var str = "abcggababcoab";var preg1 = /^abc/gm; str.match(preg1) // 结果为:["abc