正则表达式一直作为我的痛点,没有系统的学习和了解,之前部门有本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",第二个分组是汉字,第三个元素就是"老"。同时,这里有几个重点要划:

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

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

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

  4. 如果正则是一个全局的正则表达式(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老","老"]        //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对象属性

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

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

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

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

  5. 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 5

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

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

浅入正则一的更多相关文章

  1. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  2. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  6. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  7. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  8. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  9. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  10. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部