RegExp htmldiv oembedall-githubrepos { border: 1px solid rgba(221, 221, 221, 1);
前言
本文主要为笔者在学习JavaScript正则过程中的一点学习笔记,主要讲述JavaScript的正则表达式及其相关,包含String的match、replace、search和split方法。
创建正则
- 字面量方式:
var reg = /abc/;
脚本加载后编译,性能更好 - RegExp对象的构造函数
var reg = new RegExp("abc");
特殊字符
字符 | 含义 |
---|---|
^ | 匹配字符串的开始。如果多行标示被设为true,同时匹配换行后紧跟的字符 |
$ | 匹配字符串的结尾。如果多行标示被设为true,同时匹配换行前紧跟的字符 |
* | 匹配前一个字符0次或者是多次 |
+ | 匹配前一个字符1次或者多次,等同于{1,} |
? | 匹配前一个字符0次或者1次,等同于{0,1} |
. | 匹配任何除了新一行开头字符的任何单个字符 /.n/将会匹配”an apple is on the tree”中的“an”和“on”,不匹配“nay” |
(x) | 匹配‘x’并且记住匹配项,即捕获分组.匹配到子字符串可以通过结果数组的[1],…,[n]进行访问 |
(?:x) | 匹配‘x’但是不记住匹配项,即非捕获分组.匹配到子字符串不能通过结果数组的[1],…,[n]进行访问,性能略高 |
x(?=y) | 匹配‘x’仅仅当‘x’后面跟着‘y’,但是不记住‘y’。正向肯定查找,非捕获分组的一种 |
x(?!y) | 匹配‘x’仅仅当‘x’后面不跟着‘y’,不记住‘y’。正向否定查找,非捕获分组的一种 |
x|y | 匹配‘x’或‘y’ |
{n} | n是正整数,匹配前面一个字符刚好发生了n次 |
{n,m} | n,m都是正整数。匹配前面的字符至少n次,最多m次。如果n或者m的值是0,这个值被忽略 |
[xyz] | 匹配方括号中的任意字符。可以使用破折号(-)来指定一个字符范围。 |
[^xyz] | 匹配任何没有包含在括号中的字符,可以使用破折号指定一个字符范围 |
[\b] | 匹配一个退格(U+008) |
\b | 匹配一个单词的边界 |
\B | 匹配一个非单词边界 |
\d | 匹配一个数字 |
\D | 匹配一个非数字字符 |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符 |
\S | 匹配一个非空白字符 |
\t | 匹配一个水平制表符 |
\v | 匹配一个垂直制表符 |
\w | 匹配一个单字字符 |
\W | 匹配一个非单子字符 |
\n | 匹配一个换行符 |
\f | 匹配一个换页符 |
\r | 匹配一个回车符 |
\num | num 是一个正整数,返回引用到捕获分组的副字符串。 eg/\w+(,)?\w+(!)?\w+\1\w+\2/ 匹配"beijing,the!capital,of!china" |
标志值 | |
g | 全局搜索(global) |
m | 多行搜索(multiline) |
i | 不区分大小写(ignoreCase) |
RegExp方法
exec(string)
返回一个数组。eg:var myRe = new RegExp("d(b+)d", "g"), var myArray = myRe.exec("cdbbbdc");
属性或索引 描述 例子中对应的值 myArray 匹配到的字符串和所有被捕获的子字符串 [“dbbbd”, ‘bbb’] [0] 匹配的所有字符串 ‘dbbdd’ index 匹配到的字符串开始的索引值(以0开始) 1 input 输入的初始字符串 “cdbbbdc” myRe lastIndex 下一次匹配开始的索引值(只有g参数时才有用) 5 source 模式文本 “d(\b+)d” test(string)
return true/false
查询字符串里是否有该正则的匹配
String方法
match(RegExp)
- 如果正则表达式中没有g标志,返回和RegExp.match(string)相同的结果。且返回的数组同时拥有input和index属性
- 如果正则表达式包含g标志,则返回一个包含所有匹配结果的数组(无input和index属性)。没有匹配到,则返回null
split(RegExp)
通过把字符串分割成子字符串来把一个string对象分割成一个字符串数组
search(RegExp)
查看字符串对象与一个正则表达式是否匹配,返回正则表达式在字符串中首次匹配项的索引。否则,返回-1
ps:如果传入一个非正则表达式对象,则会使用new RegExp(obj)隐式地将其装换为正则表达式对象。replace(RegExp, replace|function)
使用replacement替换string中匹配的RegExp,返回替换后的字符串,不该表原字符串。
替换字符串可以插入下面的特殊变量名:变量名 代表的值 $ 插入一个”$” @@bodyamp; 插入匹配的字符串 @@title 插入当前匹配的字符串左边的内容 $’ 插入当前匹配的字符串右边的内容 $n or $nn n或nn是十进制的数字,那么插入第n个括号匹配的字符串 指定一个函数作为参数
这种情况下,当匹配执行后,该函数就会执行,函数的返回值作为替换字符串(上面的特殊参数在这里不能使用)。如果正则表达式是全局匹配模式,则该function将被多次调用,每次匹配都会被调用。
该函数的参数:变量名 代表的值 match 匹配的字符串(对应上面的@@bodyamp;) p1,p2,…,pn 代表RegExp对象中第n个括号匹配的字符串(对应于上述的$1,$2…) offset 匹配到的子字符串在原字符串中的偏移量。 string 被匹配的原字符串
几个简单小DEMO
下面使用上面刚叙述过的正则表达式来练习下
- DEMO1:
将给定的任意一串阿拉伯数字例如:123456789 返回用逗号分割的结果123,456,789function test1(str) { return str.replace(/\B(?=(?:\d{3})+$)/g, ','); }
- DEMO2:
随机给定的一串字符,将该字符串里面的所有的阿拉伯数字均增长2倍,然后返回该字符串function test2(str) { str.replace(/\d/g, function(val) { return val * 2; }); }