ES6小实验-复习正则表达式

正则表达式总是记不住,这一次参考网上一篇的文章好好复习一遍

正则表达式构造函数(四种写法):

var regex = new RegExp(‘xyz‘, ‘i‘)
var regex = new RegExp(/xyz/i)
var regex = /xyz/i
// ES6的写法。ES5在第一个参数是正则时,不允许此时使用第二个参数,会报错。
// 返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
// 下面代码返回”i”。
new RegExp(/abc/ig, ‘i‘).flags

ECMAScript5明确规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例,

var re = null,
    i
for( i=0; i < 3; i++) {
    re = /cat/g
    console.log(re.test("catastrophe"))//true true true
    console.log(re.test("catastrophe"))//false false false
}

上面之所以出现三个true,是因为每次都创建新的RegExp实例,下面出现三个false,是因为设置了全局标志,第二次调用是从索引为3的字符(上一次匹配的末尾)开始的,这一点要注意。

RegExp的每个实例都有属性:

1.global: 布尔值,表示是否设置了g标志

2.ignoreCase:布尔值,表示是否设置了i标志

3.lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起

4.multiline:表示是否设置了m标志

5.source: 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

var pattern = /\[bc\]at/i
console.log(pattern.global)//false
console.log(pattern.ignoreCase)//true
console.log(pattern.multiline)//false
console.log(pattern.lastIndex)//0
console.log(pattern.source)//\[bc\]at

RegExp对象主要方法有

1.exec(): 该方法专门为捕获组设计,

var pattern = /[bc]at/i
var str = "batterybat"
console.log(pattern.exec(str))//["bat", index: 0, input: "batterybat"]

返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串,有一点要注意:对于exec()方法而言,即使模式中设置了全局标志g,它每次也只返回一个匹配项,在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置了全局标志的情况下,每次调用exec()则都会在字符串中继续查找新的匹配项。test()也是类似,这与字符串的match()方法有区别

var pattern1 = /cat/i
console.log(pattern1.exec("catastrophe"))//["cat", index: 0, input: "catastrophe"]
console.log(pattern1.exec("catastrophe"))//["cat", index: 0, input: "catastrophe"]

var pattern2 = /cat/ig
console.log(pattern2.exec("catastrophe"))//["cat", index: 0, input: "catastrophe"]
console.log(pattern2.exec("catastrophe"))//null

从下面实验中可以看得更加清楚:

var text = "cat,bat,sat,fat"
var pattern2 = /.at/g
var matches = pattern2.exec(text)
console.log(matches.index)//0
console.log(matches[0])//cat
console.log(pattern2.lastIndex)//3

var matches = pattern2.exec(text)
console.log(matches.index)//4
console.log(matches[0])//bat
console.log(pattern2.lastIndex)//7

在全局模式下,lastIndex的值每次调用exec()后都会增加,而在非全局模式下则始终保持不变。

2. test(),在模式与参数匹配的情况下返回true,否则返回false,

限定符是最容易忘记的,因为比较多,并且又不是经常用,

        [a-z0-9]:匹配括号中的字符集中的任意字符
        [^a-z0-9]:匹配任意不在括号中的字符集中的字符
        \d:匹配数字
        \D:匹配非字符
        \w:匹配字母和数字及_
        \W: 匹配非字母和数字及_
        \0: 匹配null字符
        \b: 匹配空格字符
        . : 匹配除换行外的任意字符
        \n: 匹配换行符
        \r: 匹配回车字符
        \t: 匹配制表符
        \s: 匹配空白字符,空格,制表符,换行符
        \S: 匹配非空白字符
        ^ : 行首匹配
        $ : 行尾匹配
        x?: 匹配0或1个x
        x*: 匹配0或任意多个x
        x+: 匹配至少一个x
        (xyz)+:匹配至少一个(xyz)
        x{m,n}:匹配最少m个,最多n个x
        this|where|logo: 匹配this或where或logo中任意一个 

贪婪量词*和+:js默认是贪婪匹配,也就是说匹配重复字符是尽可能多地匹配。

惰性(最少重复匹配)量词?:当进行非贪婪匹配,只需要在待匹配的字符后面跟随一个?即可。

var reg1 = /a+/;
var reg2 = /a+?/;
var str = ‘aaab‘;
console.log(str.match(reg1)); // ["aaa"]
console.log(str.match(reg2)); // ["a"]
时间: 2024-10-07 05:31:04

ES6小实验-复习正则表达式的相关文章

ES6小实验-复习数组

ES6给数组添加了不少方法,我先把之前的方法总结一下: 1.Array.isArray():检测数组 var arr = ['a','b','c'] var str = 'abc' console.log(Array.isArray(arr))//true console.log(Array.isArray(str))//false 2.push():接收任意数量的参数,把它们逐个添加到数组末尾 var arr = ['a','b','c'] var item = arr.push('d','e

ES6小实验-复习字符串

字符串用的很频繁,而它的方法也比较多,因此有必要好好的总结下. 1.字符串观赏方法 charAt() :访问字符串中的特定字符 var str = "hello world" console.log(str.charAt(1))//e 该方法接收一个参数,即基于0的字符位置, charCodeAt():访问字符串中的特定字符的字符编码 var str = "hello world" console.log(str.charCodeAt(1))//101 该方法和上面

ES6小实验-字符串的扩展

ES6里面的对字符串的扩展实际上就是增加了一些方法,使对字符串的操作更加完善,下面做几个小实验来验证下: includes(): 返回布尔值,表示是否找到了参数字符串,支持第二的参数,表示开始的位置 'use strict'; var s = 'Hello world!'; console.log(s.includes('Hello'));//true startsWith(): 返回布尔值,表示参数字符串是否在源字符串的头部,支持第二的参数,表示开始的位置 'use strict'; var

ES6小实验-let和const(2)

继续小实验,上次写到块级作用域,那么为什么需要块级作用域呢?书中给了两个场景: 1.没有块级作用域,内层变量可能会覆盖外层变量.举例: var tmp = new Date() function f() { console.log(tmp) if(false) { var tmp = "hello world" } } f();//undefined 内层的tmp变量把外层的tmp变量覆盖,所以输出结果为undefined 2.用来计数的循环变量泄露为全局变量,举例: var s =

ES6小实验-数组的扩展

数组方法已经很多,ES6给数组又增加了不少方法: 1.Array.from():用于将两类对象转为真正的数组,类似数组的对象(array-like object) 和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map) let arrayLike = { '0': 'a', '1': 'b', '2': 'c', length:3 } let arr = Array.from(arrayLike) console.log(arr)//["a", "b&q

ES6小实验-函数的扩展

函数参数默认值 ES6允许为函数的参数直接设置默认值,即直接写在参数定义的后面 function log (x, y = "world") { console.log(x, y) } log("Hello")//Hello world 上面代码中,y是默认声明的,参数默认值可以与解构赋值的默认值,结合使用 function log ({x, y = "world"}) { console.log(x, y) } log({x: "Hel

复习正则表达式时的一个小知识点

复习正则表达式时的一个小知识点     当分组后,若要引用此小组内容可以有两种方式 1:用 ${1} 2:用 \1 两者效果是一样的

DCDC纹波小实验

关于使用示波器测试纹波的注意事项 使用示波器的AC耦合方式测量 由于示波器的头套容易引人噪声,因此在测试前必需把探头的头套去掉 因为电源的高频噪声很容易通过小电感就可以滤掉,因此更关心的是中低频的噪声.测试时将示波器的带宽限制调到尽可能的低(20MHz),避免从表笔引入噪声(我之前就吃过这方面的亏) DCDC后端接LDO AMS1117-5V的Datasheet上要求的最低压差(VIN-VOUT)为1.1V到1.25V,这就要求输入要大于5V+1.1V=6.1V,如果输入不满足这个条件会怎么样呢

初识句柄操作(控制台窗口小实验)

今日学习了控制台使用句柄操作的方法. 我们都知道,使用iostream也可以向屏幕中输出语句. 但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream和它们是C++两套不同的输入. 因此,我们需要句柄类来帮助我们完成这个操作. 下面直接上练习小代码,为贪食蛇清屏的小片段. 经一番查找,习得基本用法. 1 void clrscr(void) { 2 //控制台窗口信息类型 存有缓冲区大小 当前光标位置 窗口显示