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}$/;  

你可能感兴趣的:(Regular Expression in JavaScript)