发表于: 2017-05-08 21:35:27
1 995
今天完成的事情:
整理一波正则对象的属性和方法
属性
正则对象的属性分成两类。
一类是修饰符相关,返回一个布尔值,表示对应的修饰符是否设置。另一类是与修饰符无关的属性,主要是下面两个。
- lastIndex:返回下一次开始搜索的位置。该属性可读写,但是只在设置了g修饰符时有意义。
- source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。
test( )
正则对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串。/cat/.test('cats and dogs') // true
上面代码验证参数字符串之中是否包含cat,结果返回true。
如果正则表达式带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。
exec( )
正则对象的exec方法,可以返回匹配结果。如果发现匹配,就返回一个数组,成员是每一个匹配成功的子字符串,否则返回null。
字符串对象的方法
字符串对象的方法之中,有4种与正则对象有关。
- match():返回一个数组,成员是所有匹配的子字符串。
- search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
- replace():按照给定的正则表达式进行替换,返回替换后的字符串。
- split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。
匹配规则
字面量字符和元字符
大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b。如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的a和b),那么它们就叫做“字面量字符”(literal characters)。
除了字面量字符以外,还有一部分字符有特殊含义,不代表字面的意思。它们叫做“元字符”(metacharacters),主要有以下几个。
点字符
点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
位置字符
位置字符用来提示字符所处的位置,主要有两个字符。
- ^ 表示字符串的开始位置。
- $ 表示字符串的结束位置。
选择符(|)
竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog。
转义符
正则表达式中那些有特殊含义的字符,如果要匹配它们本身,就需要在它们前面要加上反斜杠。比如要匹配加号,就要写成+。
字符类
字符类(class)表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内,比如[xyz] 表示x、y、z之中任选一个匹配。
/[abc]/.test('hello world') // false /[abc]/.test('apple') // true
上面代码表示,字符串“hello world”不包含a、b、c这三个字母中的任一个,而字符串“apple”包含字母a。
有两个字符在字符类中有特殊含义。
(1)脱字符(^)
如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,其他字符都可以匹配。比如,[^xyz]表示除了x、y、z之外都可以匹配。
(2)连字符(-)
某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围。比如,[abc]可以写成[a-c],[0123456789]可以写成[0-9],同理[A-Z]表示26个大写字母。
注意,字符类的连字符必须在头尾两个字符中间,才有特殊含义,否则就是字面含义。比如,[-9]就表示匹配连字符和9,而不是匹配0到9。
预定义模式
预定义模式指的是某些常见模式的简写方式。
- \d 匹配0-9之间的任一数字,相当于[0-9]。
- \D 匹配所有0-9以外的字符,相当于[^0-9]。
- \w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。
- \W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。
- \s 匹配空格(包括制表符、空格符、断行符等),相等于[\t\r\n\v\f]。
重复类
模式的精确匹配次数,使用大括号({})表示。{n}表示恰好重复n次,{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次。
/lo{2}k/.test('look') // true
/lo{2, 5}k/.test('looook') // true
上面代码中,第一个模式指定o连续出现2次,第二个模式指定o连续出现2次到5次之间。
贪婪模式
上一小节的三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止。这被称为贪婪模式。
var s = 'aaa';
s.match(/a+/) // ["aaa"]
上面代码中,模式是/a+/,表示匹配1个a或多个a,那么到底会匹配几个a呢?因为默认是贪婪模式,会一直匹配到字符a不出现为止,所以匹配结果是3个a。
如果想将贪婪模式改为非贪婪模式,可以在量词符后面加一个问号。
var s = 'aaa';
s.match(/a+?/) // ["a"]
上面代码中,模式结尾添加了一个问号/a+?/,这时就改为非贪婪模式,一旦条件满足,就不再往下匹配。
修饰符
修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部。
修饰符可以单个使用,也可以多个一起使用。
g修饰符
默认情况下,第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。
声明控制器
关于控制器的声明,有2种方法,使用
module.controller("hello-controll",function ($scope){});
对于这种方式,在对js代码进行压缩的时候会造成一个问题,代码压缩工具会把$scope
这个参数压缩成a
或者其他,但是angular中这些参数名都是固定的不能更改的,所以应该选择另一种方式定义controller。
module.controller=angular.module("hi-controller",["$scope",function ($scope) {}]);
控制器的作用,我理解的是将模型数据暴露给视图,并控制视图的一些行为,当然还包括数据过滤(暂时没用到,理解不深)。视图层将数据绑定到angular中的$scope对象上,控制器再对$scope对象进行操作,2者就是这么联系起来的。
一个小TIPS
每次加载页面的时候,是先加载html,在加载angular.js,这样会造成一个问题,对于有数据绑定的标签,比如对于<h5>{{helloworld}}</h5>,页面会先显示{{helloworld}},然后再显示成helloworld。解决方案有很多种,比如把angular-js放在head里面,或者使用
ng-clock。ng-clock指令是指在ng执行后自动移除,所以可以利用这一特性,在style里面加上
[ng-clock]{ display:none }。
明天要做的事:
深入理解angular的MVC理论,视图层、控制层、模型层的关系
遇到的问题:
暂无。
收获:
每天进步一点点
评论