发表于: 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理论,视图层、控制层、模型层的关系


遇到的问题:

暂无。


收获:

每天进步一点点







返回列表 返回列表
评论

    分享到