[不成体系之备忘]JS正则表达式全接触

正则表达式可以:


•测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证

•替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字

•根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字

修饰符

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

其他备忘见http://www.w3school.com.cn/js/jsref_obj_regexp.asp

                   http://www.iteye.com/topic/481228

 

我们来着重分析JS的正则表达式的一些方法以及使用

Reg.test(str)

str = "Certainly!He loves her!";  
alert(re.test(str));//true,只要包含he(HE)就符合,如果要只是he或HE,不能有其它字符,则可使用^和$  

exec和match

/*RegExpObject.exec(string)
        返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
        */
.      var someText = "web2.0 .net2.0";
        var pattern = /(\w+)(\d)\.(\d)/;
        var outCome_exec = pattern.exec(someText);

得到的outCome_exec值为  [web2.0, web, 2, 0]. 这是一个数组. 如果在pattern这个表达式后面加上全局g. 得到的结果还是[web2.0, web, 2, 0]. 可见exec

1. 永远匹配一次

2. 返回的数组是第一次匹配的结果和分组匹配的结果合集

如果正则表达式没有全局变量, 那么string.match得到的结果是和exec一样的. 如果有了g, match就不会返回分组捕获的结果. 比如

var someText = "web2.0 .net2.0";
var pattern = /(\w+)(\d)\.(\d)/;
var outCome_matc = someText.match(pattern); //类似数组的返回值 [web2.0,web,2,0]
var pattern2 = /(\w+)(\d)\.(\d)/g;
var outCome_matc2 = someText.match(pattern2); //类似数组的返回值 [web2.0,net2.0]

1. 如果没有全局变量, 那么match和exec一样

2. 有全局变量, match只返回正则表达匹配的结果集, 而不包含任何分组捕获的结果.

PS: \w的用法, \w相当于[0-9a-zA-Z], 可是在上面的表达式中(\w+)只匹配web, 却不匹配web2.

这是因为如果\w后面跟着\d, 那么\w只相当于[a-zA-Z]

search, split, replace

search, 返回匹配的表达式的开始索引. 全局变量无效. 没找到返回-1

str = "My age is 18.Golden age!";//年龄不是一定的,我们用indexOf不能查找它的位置  
re = /\d+/;  
alert(str.search(re));//返回查找到的字符串开始下标10    
//下面的代码虽然不出错,但g标志是多余的  
re=/\d+/g;  
alert(str.search(re));//仍然是10  

其他

str ="some some             \tsome\t\f";  
re = /\s+/;  
alert(str.replace(re,"#"));//但这样只会将第一次出现的一堆空白字符替换掉  
//因为一个正则表达式只能进行一次匹配,\s+匹配了第一个空格后就退出了  
re = /\s+/g;//g,全局标志,将使正则表达式匹配整个字符串  
alert(str.replace(re,"@"));//some@some@some@  
//另一个与之相似的是split  
var str = "a-bd-c";  
var arr = str.split("-");//返回["a","bd","c"]  
//如果str是用户输入的,他可能输入a-bd-c也可能输入a bd c或a_bd_c,但不会是abdc(这样就说他输错了)  
str = "a_db-c";//用户以他喜欢的方式加分隔符s  
re=/[^a-z]/i;//前面我们说^表示字符开始,但在[]里它表示一个负字符集  
//匹配任何不在指定范围内的任意字符,这里将匹配除字母处的所有字符  
arr = str.split(re);//仍返回["a","bd","c"];  
 
replace的复杂应用
//计算某个字符串中9出现过的次数    
var str="ADF9DF9DF9",//那个文本文件中的字符串;  
    re=/9/gi,//匹配9  
    counter=0;//计数器  
    str.replace(re,function () {  
    counter++;//每出现一次匹配,函数就被执行一次,函数的返回值用来替换原值  
    return "#";  
    });  
    //最后str 变成 ADF#DF#DF#"  
function f2c(s) {
            var test = /(\d+(\.\d*)?)F\b/g;    // 初始化模式。
            return (s.replace(test, function ($0, $1, $2) {
                return ((($1 - 32) * 5 / 9) + "C");
            }));
        }
        document.write(f2c("Water freezes at 32F and boils at 212F."));
//Water freezes at 0C and boils at 100C.
PS: replace方法中的第二个参数是函数的时候, 函数里有$0,$1…..$n这样的参数, 代表正则表达式的子捕获.
replace不更新RegExp全局属性.

posted @ 2011-06-15 16:42  MyCoolDog  阅读(277)  评论(0编辑  收藏  举报