浅尝正则表达式

之前写正则都是种种上网搜刮,照样没有体系的进修过正则表达式的用法,本日稍稍研讨了一下下,觉得照样收成颇丰的,分享给列位,愿望关于你们有所协助~~

修饰符

  • g –全局婚配
  • i –不辨别大小写,默许辨别
  • m –多行搜刮

预定义类字符

  • \d: 数字;[0-9]
  • \D: 非数字字符;[^0-9]
  • \s: 空白符;[\t\n\x0B\f\r]
  • \S: 非空白符;[^\t\n\x0B\f\r]
  • \w: 单词字符(字母,数字,下划线);[a-zA-Z_0-9]
  • \W: 非单词字符;[^a-zA-Z_0-9]

字符类

  • []: 示意字符类 []中的^示意取反,-示意局限如:[0-9][a-z];

量词

  • ?: 涌现0次或许1次(最多涌现一次);
  • +: 涌现1次或许屡次(起码涌现1次);
  • *: 涌现0次或许屡次(恣意次);
  • {n}: 涌现n次;
  • {n,m}: 涌现n到m次
  • {n,}: 最少涌现n次;

经常运用的边境字符

  • ^: 以xxxx最先;
  • $: 以xxxx末端;
  • \b: 单词边境;
  • \B: 非单词边境;

贪欲形式

\d{3,6}婚配3-6个数字,那末 “12345678”就会婚配\d{6}

非贪欲形式

在量词背面加上?就会尽量少的婚配了,上面的例子\d{3,6}? 就会婚配\d{3}

分组

想要婚配abc反复三次的场景,abc{3}不就行了?事实上abc{3}婚配的是c{3},若想婚配abc3次则须要用到分组的观点了;
正则中()示意分组,及(abc){3}为婚配 abc 3次
$n代表婚配的分组
如:2018-03-03婚配换成2018年03月03日?

"2018-03-01".replace(/(\d{4})-(\d{2})-(\d{2})/g,"$1年$2月$3日");

分组中不想被婚配到的分组在分组中加上?:就能够了,如上例:

"2018-03-01".replace(/(\d{4})-(?:\d{2})-(\d{2})/g,"$1年$2月$3日");

这时刻第二个分组就不会被捕捉,就相当于有两个分组,所以不存在$3这时刻的输出效果就会是 "2018年01月$3日";

aaa | bbb 两个同时婚配

前瞻,后顾

前瞻就是在正则表达式婚配到划定规矩的时刻,向前搜检是不是相符断言(”前”的观点就是正则表达式从文本头部向尾部最先剖析)
Javascript 不支持后顾所以这里就不做过量研讨了哈。
-相符特定断言为 一定/正向 婚配
正向前瞻:exp(?=assert)
例子:

"s3&df34a7".replace(/\w(?=\d)/g,'OK');

会输出 "OK3&dOKOK4OK7"即找到婚配的单词(w)后会再次婚配背面的字符是不是是数字,假如是则当前婚配的字符替代为OK,本次替代的单词(w)是s,f,3,a

-不相符特定断言为 否认/负向 婚配
负向前瞻:exp(?!assert)
栗子:

"s3&df34a7".replace(/\w(?=\d)/g,'OK');

会输出 "sOK&OKf3OKaOK"即找到婚配的单词(w)后会再次婚配背面的字符是不是是数字,假如不是则当前婚配的字符替代为OK,本次替代的单词(w)是3,d,4,7。把7算进来我以为是婚配到7的时刻背面没有字符了是空也不是数字所以被替代了,假如不对还请大神斧正哈。

对象属性

  • global是不是全文搜刮,默许为false,修饰符中的g;
  • ignoreCase 是不是大小写敏感,默许为false,修饰符中的i;
  • multiline多行搜刮,默许为false,修饰符中的m;
  • lastIndex是当前表达式婚配内容的末了一个字符的下一个位置(有点绕哈,背面会诠释);
  • source 正则表达式的文本字符串;

举个栗子:

var reg = /\w/gim;
reg.global // true
reg.ignoreCase //true
reg.source // "\w"

要领

要领一

  • RegExp.prototype.test(str) 用于测试字符串参数中是不是存在婚配正则表达式形式的字符串,假如存在则返回true,不然返回false

举个栗子:

var reg1 = /\w/;
reg1.test('a'); // true
reg1.test('#'); // false
reg1.test('a'); // true
reg1.test('#'); // false

再举个栗子:

var reg2 = /\w/g;
reg2.test('a'); // true
reg2.test('#'); // false
reg2.test('a'); // false 
reg2.test('a'); // true
reg2.test('a'); // false 

看到区别了么?当全局检索时为何第二次实行reg2.test('a');时返回false呢?如今就要说说上文提到的对象属性lastIndex啦,没记着的回到上面看看定义,当第一次实行时我们获取到的lastIndex是1,那下一次就会从2的位置最先实行,而我们能够晓得2的位置是没有字符的,所以返回false,第三次实行的时刻有返回了true是由于查询到没有字符了lastIndex又重置了。一样的你也能够测试reg2.test('aaa')第四次实行的时刻就会是false了,须要晓得的是,只要在全局检索时(g)lastIndex才会见效,不然的话只会返回 0 哦

要领二

  • RegExp.prototype.exec(str)运用正则表达式形式对字符串实行搜刮,并将更新全局RegExp对象的属性以反应婚配效果。假如没有婚配的文本则返回null,不然返回一个数组:

    • index声明婚配文本的第一个字符的位置;
    • input寄存被检索字符串的string
非全局挪用

挪用非全局的RegExp对象的exec()要领时,返回数组

  • 第一个元素是与正则表达式相婚配的文本
  • 第二个元素是与RegExp对象的第一个子表达式(上文中的分组)相婚配的文本(假如有的话)
  • 第二个元素是与RegExp对象的第二个子表达式(上文中的分组)相婚配的文本(假如有的话),以此类推

举个栗子:

var reg = /\d(\w)(\w)\d/;
var text = '1az2bc3cf4df5gf';
var regexec =  reg.exec(text);
console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); //0    0    1az2,a,z

由于黑白全局挪用所以reg.lastIndex返回 0;regexec.index 返回了0,婚配到的文本的第一个字符是”1″,index也就是0,regexec返回的数组第一元素是与reg相婚配的文本,第二个元素是该文本中的相符正则表达式中第一个分组(w)的文本是"a"背面的z同理。

全局挪用

再来看看全局挪用的例子

var reg = /\d(\w)(\w)\d/g;
var text = '1az2bc3cf4df5gf';
while(regexec = reg.exec(text)){
    console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); 
}
// 4    0    1az2,a,z
// 10    6    3cf4,c,f

全局挪用 lastIndex 见效 离别读取到1az23cf4的下一个字符的位置,背面与非全局挪用同理,不过全局挪用返回的是整段字符串相符划定规矩的文本。

嗯哼,这篇文章就到这里了,假如对你有所协助点个赞啦猫大在此谢过啦
本文会在个人博客更新的哦,博主可好了,有空散步散步~~~

    原文作者:Mopecat
    原文地址: https://segmentfault.com/a/1190000013504338
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞