Regular Expression in JavaScript

创建正则表达式

var re = new RegExp('parameter1','parameter2');
var re = /parameter1/parameter2;

g 全文查找, i case-insensitive, m 多行查找

var re = new RegExp('a','gi');// match a & A in the text
var re = /a/gi; // same with the above

对于需要匹配符号 ( [ { \ ^ $ | ) ? * + . 需要进行转义(前置\)

对于使用RegExp构造,需要使用双重转义

new RegExp("\?") //出错,因为这相当于re = /\?/  
new RegExp("\\?") //正确,将匹配?  

 

基本使用方法

    //test方法,测试字符串,符合模式时返回true,否则返回false
    var re = /he/;//最简单的正则表达式,将匹配he这个单词
    var str = "he";
    alert(re.test(str));//true
    str = "we";
    alert(re.test(str));//false
    str = "HE";
    alert(re.test(str));//false,大写,如果要大小写都匹配可以指定i标志(i是ignoreCase或case-insensitive的表示)
    re = /he/i;
    alert(re.test(str));//true
    str = "Certainly!He loves her!";
    alert(re.test(str));//true,只要包含he(HE)就符合,如果要只是he或HE,不能有其它字符,则可使用^和$
    re = /^he/i;//^代表字符开始位置
    alert(re.test(str));//false,因为he不在str最开始
    str = "He is a good boy!";
    alert(re.test(str));//true,He是字符开始位置,还需要使用$
    re = /^he$/i;//$表示字符结束位置
    alert(re.test(str));//false
    str = "He";
    alert(re.test(str));//true
    //当然,这样不能发现正则表达式有多强大,因为我们完全可以在上面的例子中使用==或indexOf
    re = /\s/;// \s匹配任何空白字符,包括空格、制表符、换页符等等
    str= "user Name";//用户名包含空格
    alert(re.test(str));//true
    str = "user        Name";//用户名包含制表符
    alert(re.test(str));//true
    re=/^[a-z]/i;//[]匹配指定范围内的任意字符,这里将匹配英文字母,不区分大小写
    str="variableName";//变量名必须以字母开头
    alert(re.test(str));//true
    str="123abc";
    alert(re.test(str));//false

 

exec

exec返回一个数组,数组的第一个元素为完整的匹配内容,可以通过exec查询具体匹配到的元素(不匹配时返回null)

    var osVersion = "Ubuntu 8";//其中的8表示系统主版本号
    var re = /^[a-z]+\s+\d+$/i; //+号表示字符至少要出现1次,\s表示空白字符,\d表示一个数字
    alert(re.test(osVersion));//true,但我们想知道主版本号
    //另一个方法exec,返回一个数组,数组的第一个元素为完整的匹配内容
    re=/^[a-z]+\s+\d+$/i;
    arr = re.exec(osVersion);
    alert(arr[0]);//将osVersion完整输出,因为整个字符串刚好匹配re
    //我只需要取出数字
    re=/\d+/;
    var arr = re.exec(osVersion);
    alert(arr[0]);//8

 

子匹配

如果有子匹配,数组第二个元素返回子匹配的元素的值

    //exec返回的数组第1到n元素中包含的是匹配中出现的任意一个子匹配
    re=/^[a-z]+\s+(\d+)$/i;//用()来创建子匹配
    arr =re.exec(osVersion);
    alert(arr[0]);//整个osVersion,也就是正则表达式的完整匹配
    alert(arr[1]);//8,第一个子匹配,事实也可以这样取出主版本号
    alert(arr.length);//2
    osVersion = "Ubuntu 8.10";//取出主版本号和次版本号
    re = /^[a-z]+\s+(\d+)\.(\d+)$/i;//.是正则表达式元字符之一,若要用它的字面意义须转义
    arr = re.exec(osVersion);
    alert(arr[0]);//完整的osVersion
    alert(arr[1]);//8
    alert(arr[2]);//10

 

String对象与正则表达式

    //replace方法,用于替换字符串
    var str ="some money";
    alert(str.replace("some","much"));//much money
    //replace的第一个参数可以为正则表达式
    var re = /\s/;//空白字符
    alert(str.replace(re,"%"));//some%money
    //在不知道字符串中有多少空白字符时,正则表达式极为方便
    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"];
    //在字符串中查找时我们常用indexOf,与之对应用于正则查找的方法是search
    str = "My age is 18.Golden age!";//年龄不是一定的,我们用indexOf不能查找它的位置
    re = /\d+/;
    alert(str.search(re));//返回查找到的字符串开始下标10
    //注意,因为查找本身就是出现第一次就立即返回,所以无需在search时使用g标志
    //下面的代码虽然不出错,但g标志是多余的
    re=/\d+/g;
    alert(str.search(re));//仍然是10

 

贪婪量词与惰性量词 

•用贪婪量词进行匹配时,它首先会将整会字符串当成一个匹配,如果匹配的话就退出,如果不匹配,就截去最后一个字符进行匹配,如果不匹配,继续将最后一个字符截去进行匹配,直到有匹配为止。直到现在我们遇到的量词都是贪婪量词 
•用惰性量词进行匹配时,它首先将第一个字符当成一个匹配,如果成功则退出,如果失败,则测试前两个字符,依些增加,直到遇到合适的匹配为止

惰性量词仅仅在贪婪量词后面加个"?"而已,如"a+"是贪婪匹配的,"a+?"则是惰性的

var str = "abc";  
var re = /\w+/;//将匹配abc  
re = /\w+?/;//将匹配a  

 

反向引用

var re = /(A?(B?(C?)))/;  
/*上面的正则表达式将依次产生三个分组 
(A?(B?(C?))) 最外面的 
(B?(C?)) 
(C?)*/  
str = "ABC";  
re.test(str);//反向引用被存储在RegExp对象的静态属性$1—$9中  
alert(RegExp.$1+"\n"+RegExp.$2+"\n"+RegExp.$3);  
//反向引用也可以在正则表达式中使用\1 ,\2...这类的形式使用  
re = /\d+(\D)\d+\1\d+/;  
str = "2008-1-1";  
alert(re.test(str));//true  
str = "2008-4_3";  
alert(re.test(str));//false  

使用反向引用可以要求字符串中某几个位置上的字符必须相同.另外,在replace这类方法中可用特殊字符序列来表示反向引用 

re = /(\d)\s(\d)/;  
str = "1234 5678";  
alert(str.replace(re,"$2 $1"));//在这个里面$1表示第一个分组1234,$2则表示5678

 

构建一个验证电子邮箱地址有效性的正则表达式。电子邮箱地址有效性要求(我们姑且这样定义):用户名只能包含字母数字以及下划线,最少一位,最多25位,用户名后面紧跟@,后面是域名,域名名称要求只能包含字母数字和减号(-),并且不能以减号开头或结尾,然后后面是域名后缀(可以有多个),域名后缀必须是点号连上2-4位英文字母

var re = /^\w{1,15}(?:@(?!-))(?:(?:[a-z0-9-]*)(?:[a-z0-9](?!-))(?:\.(?!-)))+[a-z]{2,4}$/;  
posted @ 2015-06-27 16:25  lilixu  阅读(194)  评论(0编辑  收藏  举报