RegExp in JavaScript
RegExp定义
- 字面量形式:
var reg=/javascript/i; - 构造函数形式:
var reg=new RegExp("javascript","i");
字符类
[...]方括号内任意字符[^...]不在方括号内的任意字符.除换行符和其他Unicode行终止符之外的任意字符\wASCII字符,等价于[a-zA-Z0-9]\W等价于[^a-zA-Z0-9]\s任何Unicode空白符\S任何非Unicode空白符的字符\d数字,等价于[0-9]\D等价于[^0-9]
重复
{n,m}匹配前一项n到m次(包含n、m){n,}匹配前一项大于等于n次{n}匹配前一项n次?匹配前一项0或1次+匹配前一项1次及以上*匹配前一项0次及以上
上述表示默认为贪婪模式,即尽可能多地匹配字符数,如/a+/会匹配"aaa"中的三个字符。在正则表达式中待匹配的字符后面跟随一个?即可改为非贪婪模式,即尽可能匹配少的字符,如/a+?/只匹配"aaa"中的第一个字符。另外,正则表达式是从左到右匹配的,所以/a+?b/还是会匹配"aaab"的全部字符。
选择、分组和引用
|用于表示或选择,如/a|b/会先查找字符串是否有a,没有的话再查找是否有b。( )括号的作用有三,一是把一些字符组合为子表达式; 二是记忆/捕获与括号内容相匹配的字符; 三是引用,在正则表达式的后面可以通过\n (n为正整数)来引用前面括号中的内容, 如/(Java)Script\s+is\s+more\s+fun\s+than\s+\1最后的\1即指代前面括号中的Java。引用的一个常见用法是匹配引号,如/(['"])[^'"]*\1/。另外,正则表达式不允许双引号括起的内容中有单引号,反之亦然。- (?: ) 只起()三个作用中的第一个作用。
指定匹配的位置(类似于锚)
^匹配字符串开始$匹配字符串结束\b匹配一个单词的边界\B与\b相反,匹配一个单词的非边界处x(?=y)仅当x后面直接跟着y时,匹配xx(?!y)仅当x后面不直接跟着y时,匹配x
修饰符
iingnoreCase,忽略大小写gglobal,全局匹配mmultiline,多行匹配,在这种模式下,^可以匹配换行符\n后一行的开头,$可以匹配换行符\n这一行的结尾,
用于模式匹配的String方法
search(), replace(), match(), split()。
"JavaScript".search(/script/i); //=>4一个参数,为RegExp或String,但String会自动转换为RegExp。返回匹配的第一个子串的index值,未匹配则返回 -1。"Java".replace(/java/ig,"JavaScript"); //=>JavaScript两个参数,第一个参数可以是RegExp,也可以是String,不会自动转换。若RegExp是global的,则匹配的全部替换,否则只替换匹配到的第一个子串。"1add2==1add2".match(/\d(\w+)\d/g); //=>["1add2","1add2"],"1add2==1add2".match(/\d(\w+)\d/); //=>["1add2","add"],global模式全匹配,否则匹配第一个和记忆的内容。未匹配则返回null。"1, 2, 3, 4".split(/\s*,\s*/); //=>["1","2","3","4"]分割字符串为数组。
RegExp的属性和方法
属性
source只读,包含正则表达式的文本global只读,即带修饰符gignoreCase只读,即带修饰符imultiline只读,即带修饰符mlastIndex可读写,字符串下一次开始检索的位置
方法
- exec(),未匹配时返回 null, 非 global 时返回匹配的第一个及括号中记忆的, global 时返回 lastIndex 后匹配的第一个及括号中记忆的。
var reg=/Ja(va)\S/;
var text="JavaScript is not Java!";
console.log(reg.exec(text));
console.log(reg.exec(text));
console.log(reg.exec(text));
console.log(reg.exec(text));
=>["JavaS","va"]
=>["JavaS","va"]
=>["JavaS","va"]
=>["JavaS","va"]var reg=/Ja(va)\S/g;
var text="JavaScript is not Java!";
console.log(reg.exec(text));
console.log(reg.exec(text));
console.log(reg.exec(text));
console.log(reg.exec(text));
=>["JavaS","va"]
=>["Java!","va"]
=>null
=>["JavaS","va"]对非 global 来说每次匹配后 lastIndex 不变,还是为 0 。但对 global 来说,每次匹配后 lastIndex 变为匹配子串的后一个字符的位置,直到未匹配到之后再重新变为 0 。lastIndex可以手动改变。
- test(), 未匹配到时返回 null, 匹配到返回 true。其 lastIndex 与 global 关系类似 exec()。