以前写正则都是各类上网搜索,仍是没有系统的学习过正则表达式的用法,今天稍稍研究了一下下,感受仍是收获颇丰的,分享给各位,但愿对于大家有所帮助~~正则表达式
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日");
分组中不想被匹配到的分组在分组中加上?:
就能够了,如上例:prototype
"2018-03-01".replace(/(\d{4})-(?:\d{2})-(\d{2})/g,"$1年$2月$3日");
这时第二个分组就不会被捕获,就至关于有两个分组,因此不存在$3
这时的输出结果就会是 "2018年01月$3日";
code
aaa | bbb 两个同时匹配对象
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言("前"的概念就是正则表达式从文本头部向尾部开始解析)
Javascript 不支持后顾因此这里就不作过多研究了哈。
-符合特定断言为 确定/正向 匹配
正向前瞻:exp(?=assert)
例子:ip
"s3&df34a7".replace(/\w(?=\d)/g,'OK');
会输出 "OK3&dOKOK4OK7"
即找到匹配的单词(w)后会再次匹配后面的字符是否是数字,若是是则当前匹配的字符替换为OK,本次替换的单词(w)是s,f,3,a字符串
-不符合特定断言为 否认/负向 匹配
负向前瞻:exp(?!assert)
栗子:get
"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
生效 分别读取到1az2
和3cf4
的下一个字符的位置,后面与非全局调用同理,不过全局调用返回的是整段字符串符合规则的文本。
嗯哼,这篇文章就到这里了,若是对你有所帮助点个赞啦猫大在此谢过啦
本文会在我的博客更新的哦,博主可好了,有空溜达溜达~~~