彻底理解正则

在此之前的项目开发中,发现利用正则方法能够提高开发效率,所以看着教程和博客,自己重新学习了一遍正则,并记录下来。

正则声明

构造函数声明方式
var pat = new RegExp(pattern,modifiers);

字面量声明方式
var pat = /pattern/modifiers

tip:参数解释
pattern:模式,要匹配的内容。
modifiers:修饰符

i:ignore。不区分大小写的匹配

g:global。全局匹配

m:多行匹配
ps:这三个可以连用,无顺序之分。

var reg = new RegExp('abc','ig'); // 代表不区分大小写并且全局匹配abc。 var reg = /abc/m // 代表多行匹配abc。

正则字符

^ 表示匹配输入字符串的开始位置
^abc => 代表整个字符中匹配首个字符串为abc的

$ 表示匹配输入字符串的结束位置
abc$ => 代表整个字符中匹配尾部字符串为abc的

. 表示匹配换行符\n之外的任何字符
. <=> \w\d\r\f\t\v
ps:[.] 这种模式代表只匹配.字符,等价于'.'

[] 表示字符集合。匹配所包含的任意一个字符
[abc] => apple也符合[abc]中的a
[abcdef] => football也符合[abcdef]的a,b,f
[^abc] => 代表不包含abc的任何字符都可匹配
ps: ^abc与[^abc]的区别:

^abc 代表整个字符中匹配首个字符串为abc的

[^abc] 代表不包含abc的任何字符都可匹配

{} 表示匹配字符的数量,量词
a{2} => 代表匹配确定a只能出现两次

{n} 匹配确定的n次
a{2} => 代表匹配确定a只能出现两次 aa

{n,} 表示至少匹配n次
a{2,} => 代表匹配确定a至少出现两次 aa,aaa,aaaa

{m,n} 表示最少出现m次,最多出现n次
a{2,4} => 代表匹配确定a最少出现2次,最多出现4次 aa,aaa,aaaa

| 表示或的关系,两者都可匹配
a|b => 代表a和b都可以匹配到

() 表示分组符,一代表匹配里面的字符并获取这一匹配。二代表优先级
(partten) => 匹配pattern并获取这一匹配
^(0|[1-9][0-9]*)$ => 代表零和非零开头的数字
ps:(?:pattern) => 匹配pattern但不获取匹配结果。

+ 表示前面的字符必须至少出现一次(1次或多次)
a+bc <=> abc | aabc | aaabc
ps:+ 等价于 {1,}

* 表示字符可以不出现,也可以出现1次或多次
a*bc <=> bc | abc | aabc
ps: * 等价于 {0,}

? 表示前面的字符最多只可以出现一次(0次或1次)
a?bc <=> bc | abc

常用字符和非打印字符

\d 匹配一个数字字符
\d 等价于 [0-9] (\d <=> \[0-9\])

\D 匹配一个非数字字符
\D 等价于 [^abc] (\D <=> \[^0-9\])

\w 匹配字母,数字,下划线
\w <=> \[A-Za-z0-9_\]

\W 匹配非字母,数字,下划线
\W <=> \[^A-Za-z0-9_\]

\b 匹配一个单词边界,也就是单词和空格间的位置

\B 匹配一个非单词边界
eg: /ter\b/ => 可匹配chapter,不能匹配terminal

\n 换行符

\r 回车符

\f 换页符

\t 制表符

\v 垂直制表符

\s 匹配任何空白字符,包括空格,制表符,换页符
\s <=> \[\f\n\v\t\r\]

\S 匹配任何非空白字符
\S <=> \[^\f\n\r\v\t\]

正则方法

var reg = new RegExp()
var str = 'abc'; typeof str == 'string'

reg.test(str); 用来测试某个字符串是否与正则匹配,返回值是一个布尔值,匹配为true,不匹配为false。

var reg = /^a?b+c*/ var str1 = 'aabbcc' var str2 = 'bc' reg.test(str1) // false ?代表的是最多出现一次 reg.test(str2) // true

reg.compile(str) 能够对正则表达式进行编译,方便多次调用,提高性能。参考菜鸟教程的说法:该方法可以编译指定的正则表达式,编译之后的正则表达式执行速度将会提高,如果正则表达式多次被调用,那么调用compile方法可以有效的提高代码的执行速度,如果该正则表达式只能被使用一次,则不会有明显的效果。

var str="Every man in the world! Every woman on earth!"; patt=http://www.likecs.com/man/g; str2=str.replace(patt,"person"); console.log(str2); // Every person in the world! Every woperson on earth! patt=http://www.likecs.com/(wo)?man/g; patt.compile(patt); str2=str.replace(patt,"person"); console.log(str2); // Every person in the world! Every person on earth!

reg.exec(str) 接受一个字符串,返回一个数组,否则返回null。
返回值是数组 解释:
1 如果有多个匹配的话
       1 此数组的第0个元素是与正则表达式相匹配的文本。
       2 第一个元素是与reg的第一个子表达式相匹配的文本,(如果有的话)
       3 第二个元素是reg的第二个子表达式相匹配的文本,(如果有的话)
       4……
2 index 匹配文本的第一个字符的索引
3 input 是被检索的字符串str

var str = '2018ceshi2019' var reg = /(\d)(\w)/; var result = reg.exec(str) console.log(result);//["20", "2", "0", index: 0, input: "2018ceshi2019"] var str = 'The Quick Brown Fox Jumps Over The Lazy Dog' var reg = /quick\s(brown).+?(jumps)/ig; var result = reg.exec(str); console.log(result); //  ["Quick Brown Fox Jumps", "Brown", "Jumps", index: 4, input: "The Quick Brown Fox Jumps Over The Lazy Dog", groups: undefined] // result [0] 匹配的全部字符串 'Quick Brown Fox Jumps' // [1],[2],...[n] 括号中的分组捕获 [1] = Brown [2] = Jumps // index :匹配到的字符位于原始字符串的基于0的索引值 4 // input : 原始字符串 The Quick Brown Fox Jumps Over The Lazy Dog ps:如果不需要捕获分布的内容,则在不需要分组捕获里面加上?:,此表示匹配不捕获。
var reg = /quick\s(?:brown).+?(?;jumps)/ig; 这样就不会有[1],[2],...[n]的分组捕获了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfggx.html