资讯专栏INFORMATION COLUMN

浅入正则(一)

zhaofeihao / 1109人阅读

摘要:例在第行中,结果为,因为第四行中的匹配成功后,为,也就是下一次是从开始匹配,所以匹配失败,返回,并把置为浅入正则二字符的含义和使用

正则表达式一直作为我的痛点,没有系统的学习和了解,之前部门有本500多页的书叫《精通正则表达式》,一直没勇气拿起来。到后来业务中需要正则的地方越来越多,不忍心老找人帮忙写正则了。找了资料先看着,至少自己先入个门。

with (javascript)

实例化RegExp对象

实例化RegExp对象同实例化其他JavaScript内置对象一样,分别有字面量和构造函数两种方法:

var reg1 = /d/g;                    //全局匹配数字
var reg2 = new RegExp("D","g");    //全局匹配非数字
RegExp对象原型方法

类似Array/String/Function都有自己的原型方法,RexExp对象同样有自己的原型方法。

test

不管正则6不6,test方法一定都会用:RegExpObject.test(string); string中是否含有RegExpObject中匹配的字符串片段,有则返回true,否则返回false

/d/g.test("abc");        //false
/d/g.test("123");        //true
exec

这个方法很强大,但是理解起来有点难,简单说,用法是:RegExpObject.exec(string);这个和test一样,返回值是返回一个数组或者null,也就是说RegExpObjectstring中成功匹配到了字符串片段,则返回一个数组,这个数组各项分别是:

[
    0: "与正则表达式匹配的文本",
    1: "与正则表达式第一个分组匹配的文本",    //分组就先理解为一个括号为一个分组
    2:" 与正则表达式第二个分组匹配的文本",
    3: "···以此类推"
]
//来个例子: 
var reg1 = /([a-zA-Z]d)+([u4e00-u9fa5])+/;
//匹配 (大小写字母连着一个数字) 至少一次 (再连着汉字) 至少一次
var str1 = "a11B2老cd3李e45好";
var result = reg1.exec(str1);
console.log(result);                     //["B2老", "B2", "老"]

例子中正则匹配数字的结果是"B2老";所以结果数组中第一个元素为"B2老",第一个分组是(大小写字母连着一个数字),第二个元素就是"B2",第二个分组是汉字,第三个元素就是"老"。同时,这里有几个重点要划:

返回结果的数组自带另外两个属性:index:匹配成功字符串片段的起始index; input:存放被检测的字符串,也就是例子中的str1;

如果整个正则没有匹配结果,仅仅其中某个分组有匹配结果,则exec的返回值为null。所以test方法也可以使用RegExpObject.exec(string) != null;来替代;

如果其中某个分组有多个匹配结果,例如:我们str1改"a1B2老cd3李e45好";那么 (大小写字母连着一个数字) 这个分组就有多个匹配结果,a1B2;那么返回到数组中的是最后一个匹配成功的结果,也就是B2;

如果正则是一个全局的正则表达式(global);那么返回值数组会首先取第一段匹配成功的结果输出,然后第二次执行会取第二段,依次循环类推,例如:

var reg2 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g;

//匹配 (大小写字母连着一个数字) 至少一次 (再连着汉字) 至少一次
var str2 = "a11B2老cd3李e45好";
var result1 = reg2.exec(str2);
var result2 = reg2.exec(str2);
var result3 = reg2.exec(str2);

console.log(result1,result2,result3);

//输出:
["B2老", "B2", "老"]        //index: 3
["d3李", "d3", "李"]        //index: 7
null
toString

方法同ObjecttoString方法;将RegExp对象转为字符串。

var reg3 = /d/g;
var reg4 = new RegExp("d","g");
reg3.toString();            //"/d/g"
reg4.toString();            //"/d/g"
RegExp对象属性

global: 只读,简写g;被设置则表示全局搜索,即在字符串中查找到所有匹配条件的字符串片段,不设置的话匹配到第一个成功的即停止;

ignoreCase: 只读,简写i;不区分大小写;

multiline: 只读,简写m;多行匹配,字符串中带有换行符时,如果不设置i属性,则只匹配第一行,设置后所有行均匹配且每行的开头/结尾可以作为开头/结尾被匹配(^/$);

source: 只读,返回正则表达式的文本,简单说,上例中的正则表达式/([a-zA-Z]d)+([u4e00-u9fa5])+/gim,去掉两边的斜杠和斜杠外的东西//gim,结果就是([a-zA-Z]d)+([u4e00-u9fa5])+

lastIndex: 读写,在全局正则表达式的前提下,上一次匹配成功的文本片段的最后一个字符之后一个文本的位置,也是下一次匹配的起始位置,初始为0,无匹配结果时置为0。例:

var reg5 = /d/g;
var str5 = "a1bc2e3fj";
console.log(reg5.lastIndex);                         //0
console.log(reg5.test(str5), reg5.lastIndex);        //true 2
console.log(reg5.test(str5), reg5.lastIndex);        //true 5
console.log(reg5.test(str5), reg5.lastIndex);        //true 7
console.log(reg5.test(str5), reg5.lastIndex);        //false 0
console.log(reg5.test(str5), reg5.lastIndex);        //true 2
console.log(reg5.test(str5), reg5.lastIndex);        //true 5

在第5行中,结果为false,因为第四行中的匹配成功后,lastIndex为7,也就是下一次是从f开始匹配,所以匹配失败,返回false,并把lastIndex置为0

浅入正则(二):字符的含义和使用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83868.html

相关文章

  • 浅入正则(二)

    摘要:前一篇浅入正则一了解了实例化一个对象的原型方法的对象属性这些基础,大致知道正则怎么用,这一篇主要想了解一下正则怎么写。 with (javascript) 前一篇浅入正则(一)了解了实例化一个RegExp对象、RegExp的原型方法、RegExp的对象属性这些基础,大致知道正则怎么用,这一篇主要想了解一下正则怎么写。 元字符 元字符表随便就查得到,但这是会写正则最重要的基础,这里简单分...

    MRZYD 评论0 收藏0
  • js基础常用知识点由浅入深整理篇

    摘要:因为同一时间,只能处理一个异步,这又牵扯到单线程问题了。然后控制台默默打印了个目前前端,异步主要为前后端交互以及定时器,仅仅说前端,如果说的话,还有文件读取等其他的方面会异步。 此篇文章完全按照我个人理解去写。 1.何为JS 先说说js干啥的。不负责点说,js就是操作浏览器的。 有人可能说nodeJS,nodeJS严格意义上只能说是用的ES,因为他没有dom ,也没有bom。 简单点说...

    Zack 评论0 收藏0
  • 浅入深laravel教程附录1:全局助手函数之字符串部分

    摘要:一静态属性缓存部分由于每次正则替换费时,所以有个动物函数,框架使用静态属性保存,提高效率的意思是大驼峰式,这个函数是将转换成的意思骆驼,这个函数是小驼峰格式,第一个字母是小写字母转换成的意思是蛇,很形象,整个身子都一样粗,它只对中有大写 一:静态属性缓存部分 由于每次正则替换费时,所以有4个动物函数,框架使用静态属性保存,提高效率 01:Str::studly($value)studl...

    sushi 评论0 收藏0
  • 【实践】玩转正则表达式+JS正则处理函数

    摘要:前言写这篇文章不是空穴来风,最近一个礼拜写了一个简单的脚本,用来处理上千个文件,以便于在某些特定字符的周围添加标记,先说一下我这个脚本使用场景主要是来识别中文具体做什么,之后会单独写一篇文章,此处只提该脚本作用,同时为不同的文件类型,包括, 前言 写这篇文章不是空穴来风,最近一个礼拜写了一个简单的nodejs脚本,用来处理上千个文件,以便于在某些特定字符的周围添加标记,先说一下我这个脚...

    DoINsiSt 评论0 收藏0
  • 浅入深地教你开发自己的 React Router v4

    摘要:也就是说通过我们自己构建来解释是否是一个合适的路由抽象。首先,并不需要,因为如果路由中没有给那么将会自动渲染。基本上我们的路由只要关心的变化并且返回相应的即可。为了解决这个问题,需要跟踪每一条并且当路由发生改变的时候调用。 showImg(https://segmentfault.com/img/remote/1460000008803951?w=800&h=615); 作者:Tyl...

    alin 评论0 收藏0

发表评论

0条评论

zhaofeihao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<