一、前言
关于正则表达式自身的语法这里不做过多介绍(详情可参见http://www.php100.com/manual/unze.html),这里仅仅解释javascript中和正则表达式相关的几个方法的使用。
二、javascript中的RegExp对象
在javascript中,有两种方法可以构建正则:
正则表达式字面量
RegExp构造器
RegExp对象有以下属性:
global:如果标识g,则为true
ignoreCase:如果标识i被使用,则为true
lastIndex:下一次exec匹配开始的索引,初始值为0
multiline:如果标识m被使用,则为true
source:正则表达式源文本
三、正则表达式中的特殊需转义的字符
在正则表达式字面量中,如果希望下面的字符按照字面进行匹配:
/ \ [ ] ( ) { } ? + * | . ^ $
必须要用一个\前缀进行转义。如果拿不准的话,可以个任何特殊字符都添加一个\前缀使其字面化。注意\前缀不能使字母或数字字面化。
四、javascript中可以操作正则表达式的相关方法
在javascript中,可以处理正则表达式的方法有:
regexp.exec
regexp.test
string.match
string.replace
string.search
string.split
下面重点介绍一下上述方法的用法:
1.regexp.exec(string)
exec方法是使用正则表达式的最强大(和最慢)的方法。如果它成功的匹配了string,会返回一个数组,数组中下标为0的元素将包含正则表达式regexp匹配的子字符串,下标1的元素是分组1捕获的文本...依次类推,除了数组元素和length属性外,exec还返回两个属性,index声明的是匹配文本的第一个字符的位置,input属性则存放的是被检索的字符串。如果匹配失败,会返回null。在调用非全局的regexp对象的exec方法时,返回的数组与调用方法string.match返回的数组是相同的。
如果exep带有一个g表示,事情会变得负责,查找不是从这个字符的起始位置开始,而是从regexp.lastIndex(初始值为0)位置开始。如果匹配成功,那么regexp.lastIndex将被设置为该匹配后第一个字符的位置。这就意味着可以反复调用exec()来获得字符串中所有匹配文本,当再也找不到匹配的文本时,它将返回null,并会重置regexp.lastIndex为0.
这就允许通过循环调用exec去查询一个匹配模式在一个字符串中发生了几次,有两件事需要注意。1.如果提前退出了循环,在此进入循环前必须把regexp.lastIndex重置为0;2.^因子仅匹配regexp.lastIndex为0的情况。
具体可参见下面的案例:
var str=‘visit bobo bobo‘; var patt=/bobo/g; var result; console.log(‘带有g标示的循环调用‘); while((result=patt.exec(str))!=null){ console.log(result);//第一次输出["bobo", index: 6, input: "visit bobo bobo"],第二次循环输出["bobo", index: 11, input: "visit bobo bobo"] //下一个匹配位置 console.log(patt.lastIndex);//第一次输出10,第二次输出15 //匹配文本的第一个位置 } console.log(‘非手动退出循环时regexp.lastIndex的值‘); console.log(patt.lastIndex);//输出0 console.log(‘不带g标示的exec‘); var patt1=/bobo/; var result1=patt1.exec(str); console.log(patt1.lastIndex);//不带g标识的时候,每一次exec执行完毕,lastIndex都重置为0 console.log(result1);//["bobo", index: 6, input: "visit bobo bobo"]
2.regexp.test(string)
test方法是使用正则表达式最简单(和最快)的方法,如果匹配返回true,否则返回false。
r.test(string)等同于r.exec(string)!=null.不要对这个方法运用g标识。
3.string.match(regexp)
match方法让一个字符串和一个正则表达式进行匹配。它一句g标识来决定如何进行匹配。
如果没有g标识,那么调用string.match(regexp)的结果与调用r.exec(string)的结果相同。仅仅执行一次匹配,如果没有找到任何匹配的文本,就返回null。否则返回一个数组,数组的第0个是匹配的文本,下标为1对应着捕获组1捕获的文本,...以此类推。此外,结果还具有index和input属性。分别表示匹配开始的下标和输入的文本。
如果带有g表示,那么它执行全局检索,生成一个包含所有匹配(除捕获分组之外)的数组;若没有找到任何匹配的元素则返回null。全局匹配返回数组的内容与前者大不相同,数组中存放的是string的所有匹配子串,也没有index属性和input属性。
在全局检索模式下,match即不提供子表达式匹配的文本的信息,也不声明匹配的位置,如果需要这些信息,可以使用regexp.exec()