js基本功——RegExp
目录:
global 是否进行全局匹配,对象是否具有标志 g
ignoreCase 是否忽略大小写匹配,对象是否具有标志i
lastIndex 一个整数,表示下此匹配的开始位置
multiline 是否进行多行匹配,对象是否具有标志m
source 正值表达式的源文本
compile(reg, mod)
用于在脚本执行过程中编译正则表达式
也可用于改变和重新编译正则表达式
reg,正则表达式
mod,修饰符
exec(str)
在str中检索匹配值
返回null或一个数组
每次执行指得到一个匹配结果,如果要获得所有匹配结果,需配合while循环实现
如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0
1 var w = function(str=""){document.write(str+"<br>")}; 2 var str = "aa bb cc dd"; 3 var patt = /a/g; 4 var res = patt.exec(str); 5 var ares=[]; 6 while(res){ 7 ares.push(res); 8 res = patt.exec(str); 9 } 10 w(ares);
test(str)
在str中检索匹配值
返回true 或 false
str.search(reg)
在str中检索reg,返回检索到的值或-1
str.match(reg)
在str中检索reg,返回null或一个数组,但数组内容与是否为全局匹配有关
如果非全局匹配,则数组第0个元素存放匹配文本,其余元素存放与正则表达式的子表达式匹配的文本,该数组有两个对象属性,index属性声明的是匹配文本在被检索文本中的位置,input属性是对被检索文本的引用;
如果是全局匹配,则数组的所有元素均为匹配到的匹配文本,同时数组也没有index和input属性;
var w = function(str){document.write(str+"<br>")} var str = "abcdefabcdefabcdef"; w("懒惰模式匹配"); var arr = str.match(/(a)(b)/); w("arr.length: "+arr.length); w("arr[0]: "+arr[0]); w("arr[1]: "+arr[1]); w("arr[2]: "+arr[2]); w("arr.index: "+arr.index); w("arr.input: "+arr.input); w("<br>"); w("懒惰模式匹配"); arr = str.match(/a/g); w("arr.length: "+arr.length); w("arr[0]: "+arr[0]); w("arr[1]: "+arr[1]); w("arr[2]: "+arr[2]); w("arr.index: "+arr.index); w("arr.input: "+arr.input);
str.replace(substr/reg, replacement)
replace函数会依据匹配模式用replacement替换一个或多个substr或者reg匹配文本,并返回替换完成后的字符串。
replacement可以是字符串,函数或者子表达式匹配值;
子表达式匹配值用$符号表示,具体如下
$1, $2, $3 分别表示前3个子表达式匹配到的值
$& 表示与reg相匹配的子串
$` (位于Esc下面那个键) 表示位于匹配文本左侧的子串
$' (单引号) 表示位于匹配文本右侧的子串
$$ 直接量符合,这里代表$符号
replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。
该函数的第一个参数是匹配模式的字符串。
接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。
接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。
最后一个参数是 stringObject 本身。
1 var w = function(str=""){document.write(str+"<br>")} 2 var str = "abcdefabcdefabcdef"; 3 w("str.replace(/abc/,'$$'): "+str.replace(/abc/,'$$')); 4 str.replace(/(a)(b)(c)/g,function(){ 5 w("arguments.length: "+arguments.length); 6 for(var i in arguments){ 7 w("arguments["+i+"]: "+arguments[i]); 8 } 9 w(); 10 });
str.split(separator/reg, howmany)
通过指定的分隔符或正则表达式将str分解成数组
howmany为可选参数,声明了返回的数组的length
1 var w = function(str=""){document.write(str+"<br>")} 2 var str = "a,b,c,d,e"; 3 var arr = str.split(/,/,3); 4 w(arr);
第一种方法:
var reg = /pattern/attributes;
第二种方法:
var reg = new RegExp(pattern, attributes);
pattern 是一个字符串,指定了正则表达式匹配模式或其它正则表达式
attributes 是一个可选字符串参数,包含属性g i m ,分别对应全局匹配,忽略大小写匹配和多行匹配
i 忽略大小写进行匹配
g 全局匹配
m 多行匹配
[abc] 查找方括号中的任意字符,无论a,还是b或c,只要出现就匹配成功
[^abc] 查找非方括号中的任意字符,只要不是a,不是b也不是c,就匹配成功
[0-9] 匹配数字0到9
[a-z] [A-Z] [A-z] 匹配范围包含的字母
[red|green|blue] 查找任意指定的选项,即red或者green或者blue,只要出现即匹配成功
. 除\n \r以外的任意字符
\w 数字或字母字符
\W 非数字且非字母的字符
\d 数字字符
\D 非数字字符
\s 空白符
\S 非空白符
\b 单词边界
\B 非单词边界
\0 NUL字符,即\0本身,这里的\0与\b一样,是一个字符编码表示的,也就是\0是一个整体,用\\0是匹配不到的
如果\0出现在input元素的value值里面,则可以用\\0进行匹配,因为这里的\和0是两个字符编码,是独立的
\n 换行符
\f 换页符
\r 回车符
\t 水平制表符
\v 垂直制表符
\ddd 八进制数ddd所对应的字符,例如 \127 代表 W
\xdd 十六进制数dd所对应的字符,例如 \x57 代表 W
\udddd 十六进制数dddd所对应的unicode字符,例如 \u0057 代表 W
+ 一个或多个
* 零个或多个
? 零个或一个
{X} X个
{X,Y} X到Y个
{X,} X个或更多
$ 以此符号前面的字符为结尾的
^ 以此符号后面的字符为开头的
?= 匹配后面紧跟着此符号后面那个字符的文本
?!= 匹配后面没有紧跟此符号后面那个字符的文本
表达式中用小括号括起来的部分就是一个子表达式
/(\d)\s(\d)/,其中的两个\d及为两个子表达式
子表达式会在match一级其它一些函数中应用到
子表达式是反向引用的先天条件
在表达式中,\1表示第一个子表达式匹配的结果
/\d\s\d/ 可以匹配 1 2,和1 3,但是/(\d)\s\1/则只能匹配1 1,2 2,3 3之类的内容
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>test</title> 5 <script> 6 var w = function(str=""){document.write(str+"<br>")}; 7 var str = "abcdefabcdefabcdef"; 8 9 var arr = str.match(/(a)(b)/); 10 w("arr.length: "+arr.length); 11 w("arr[0]: "+arr[0]); 12 w("arr[1]: "+arr[1]); 13 w("arr[2]: "+arr[2]); 14 w("arr.index: "+arr.index); 15 w("arr.input: "+arr.input); 16 w("<br>"); 17 18 arr = str.match(/a/g); 19 w("arr.length: "+arr.length); 20 w("arr[0]: "+arr[0]); 21 w("arr[1]: "+arr[1]); 22 w("arr[2]: "+arr[2]); 23 w("arr.index: "+arr.index); 24 w("arr.input: "+arr.input); 25 w("str.replace(/abc/,'$$'): "+str.replace(/abc/,'$$')); 26 str.replace(/(a)(b)(c)/g,function(){ 27 w("arguments.length: "+arguments.length); 28 for(var i in arguments){ 29 w("arguments["+i+"]: "+arguments[i]); 30 } 31 w(); 32 }); 33 34 str = "a,b,c,d,e"; 35 arr = str.split(/,/,3); 36 w(arr); 37 38 str = "\0"; 39 var reg = /\0/g; 40 w(reg.test(str)); 41 42 str = '\\'; 43 reg = /\s/; 44 w(reg.test(str)); 45 46 reg = /\\s/; 47 w(reg.test(str)); 48 49 str="a\b\c\defg"; 50 w("str.charCodeAt(1): "+str.charCodeAt(1)); 51 w(String.fromCharCode(8)); 52 var str1 = str.replace(/\\/, ''); 53 str1 = str1.replace(/\u0008/,'b'); 54 w("str1: "+str1); 55 </script> 56 </head> 57 <body> 58 <input type="text" name="" value = "a\b\c\defg" style="display:none"> 59 <script> 60 str = document.getElementsByTagName('input')[0].value; 61 w("str.charCodeAt(1): "+str.charCodeAt(1)); 62 w(String.fromCharCode(92)); 63 w("str: "+str); 64 str1 =str.replace(/\\/g, ""); 65 w("str1: "+str1); 66 </script> 67 </body> 68 </html>

浙公网安备 33010602011771号