正则表达式

在客户端验证,可以节约大量的服务器端的系统资源,并且提供更好的用户体验。

var box=new RegExp('Box'); //第一个参数是模式字符串
console.log(box); // /Box/ 两个反斜杠是正则表达式的字面量表示法


var box=new RegExp('Box','ig'); //第二个参数可选,模式修饰符
console.log(box); // /Box/gi


参数 含义
i 忽略大小写
g 全局匹配
m 多行匹配

--------------------------------------------------------------------

var box=/Box/; // 使用字面量方式的正则
console.log(box); // /Box/


var box=/Box/ig; // 字面量正则,带修饰符的
console.log(box); // /Box/gi

--------------------------------------------------------------------

测试正则表达式:

方法 功能

test() 在字符串中测试模式匹配,返回true或false
exec() 在字符串中执行匹配搜索,返回结果数组

var pattern=new RegExp('Box'); //模式
var str='box';
console.log(pattern.test(str)); //返回的是false,大小写不一致

var pattern=new RegExp('Box','i'); //忽略大小写
var str='box';
console.log(pattern.test(str)); //true

------------------------------------------------------------------------
一句话匹配:
console.log(/Box/i.test('box')); //true
------------------------------------------------------------------------

var pattern=/Box/i; //使用字面量的方式
var str='box';
console.log(pattern.test(str)); //true

------------------------------------------------------------------------
var pattern=/Box/i; //不区分大小写匹配
var str='This is a box!'; //一句英文
console.log(pattern.test(str)); //字符串中是否包含模式中的正则
//This is a box!中是否包含不区分大小写的Box

------------------------------------------------------------------------
var pattern=/Box/i;
var str='box';
console.log(pattern.exec(str)); //box
console.log(typeof pattern.exec(str)); //object 有就返回数组的值,没有就返回null

var pattern=/Box/i;
var str='ssss';
console.log(pattern.exec(str)); //null 如果没有匹配到就返回null
console.log(typeof pattern.exec(str)); //object

exec()的用法:

var pattern = /Box/gi;
var str = 'box BOX bOX';
var result;
while ((result = pattern.exec(str)) != null) {
document.write(result);
document.write("<br/>");
document.write(pattern.lastIndex);
document.write("<br/>");
}

------------------------------------------------------------------------
使用字符串的正则表达式方法:
除了test()和exec()方法,String对象也提供了4个使用正则表达式的方法。

方法 含义
match(pattern) 返回pattern中的子串或null
replace(pattern,replacement) 用replacement替换pattern
search(pattern) 返回字符串中pattern开始位置
split(pattern) 返回字符串按指定pattern拆分的数组

match:

var pattern=/Box/ig;
var str='This is a Box! That is a Box!';
console.log(str.match(pattern)); //Box,Box 返回的是一个数组

var pattern=/Box/i; //没有开启全局
var str='This is a Box! That is a Box!';
console.log(str.match(pattern)); //Box 匹配到第一个字符串返回数组

-------------------------------------------------------------------------

search:查找位置

var pattern=/Box/i; //因为这个查找到一个就返回,所以没有必要全局查找
var str='This is a Box! That is a Box!';
console.log(str.search(pattern)); //10 返回的第一个匹配的位置


var pattern=/xox/i;
var str='This is a Box! That is a Box!';
console.log(str.search(pattern)); //找不到返回-1
-------------------------------------------------------------------------

replace:

var pattern=/Box/i; //没有开启全局
var str='This is a Box! That is a Box!';
console.log(str.replace(pattern,'Tom')); //This is a Tom! That is a Box! 返回替换后的字符串,只限第一个

var pattern=/Box/ig; //开启全局
var str='This is a Box! That is a Box!';
console.log(str.replace(pattern,'Tom')); //This is a Tom! That is a Tom! 返回替换后的字符串,所有匹配都会被替换

-------------------------------------------------------------------------

split:

var pattern=/!/ig;
var str='This is a Box! That is a Box!';
console.log(str.split(pattern)); //This is a Box, That is a Box,

var pattern=/ /ig;
var str='This is a Box! That is a Box!';
console.log(str.split(pattern)); //This,is,a,Box!,That,is,a,Box!
console.log(str.split(pattern).length); //8 数组的长度

-------------------------------------------------------------------------
静态属性,无需声明

属性 短名 含义
input $_ 当前被匹配的字符串
leftContext 匹配前的子串
rightContext 匹配后的子串
lastMatch 最后一个匹配字符串
lastParen 最后一对圆括号内的匹配子串

var pattern=/google/i;
var str="This is a google!";
pattern.test(str); //必须执行一下,静态属性才有效
console.log(RegExp.input); //This is a google! 打印出当前被匹配到的字符串

var pattern=/google/i;
var str="This is a google!";
pattern.test(str); //必须执行一下,静态属性才有效
console.log(RegExp.leftContext); //This is a 匹配到的字符串的前子串

var pattern=/google/i;
var str="This is a google!,That is a google?";
pattern.test(str); //必须执行一下,静态属性才有效
console.log(RegExp.rightContext); // !,That is a google? 匹配到的字符串的后子串

var pattern=/google/i;
var str="This is a google!,That is a google?";
pattern.test(str); //必须执行一下,静态属性才有效
console.log(RegExp.lastMatch); //google 最后一个匹配到的字符串


分组:
var pattern=/(g)oogle/ig;
var str='This is a google! ';
pattern.test(str);
console.log(RegExp.lastParen); //g

ps:Opera 不支持 input、lastMatch、lastParen和multiline属性。IE不支持multiline属性。


var pattern=/google/m;
console.log(pattern.global); //false 表示没有开启全局
console.log(pattern.ignoreCase); //false 表示没有开启大小写
console.log(pattern.multiline); //true 是否开启多行
console.log(pattern.source); //google 正则里面的原字符串

-------------------------------------------------------------------------
重点
获取控制:

元字符/元符号 . 匹配除换行符(\n)外的任意字符

var pattern=/g.ogle/;
var str='g@ogle'; //一个点代表可以放任意字符
console.log(pattern.test(str)); //true

---------------------------------------------
var pattern=/go*gle/; //o*,表示0个,1个,或者多个o
var str='ggle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/go+gle/; //o+,表示1个,或者多个
var str='google'; //至少要写一个o
console.log(pattern.test(str));
---------------------------------------------
var pattern=/go?gle/; //o?,表示1个,或者0个
var str='google';
console.log(pattern.test(str)); //false
---------------------------------------------
var pattern=/g.?gle/; //.?,表示1个,或者0个的任意字符
var str='gbgle';
---------------------------------------------
var pattern=/go{2,4}gle/; //o{2,4},表示匹配o2-4次,包含2和4
var str='google';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/go{3}gle/; //o{3},表示只能限定为3个
var str='gooogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/go{3,}gle/; //o{3,},表示为3个或3个以上
var str='goooogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/[a-z]oogle/; //[a-z]表示26个小写字母,任意一个都可以匹配
var str='xoogle';
console.log(pattern.test(str)); //true

---------------------------------------------
var pattern=/[A-Z]oogle/; //[A-Z]表示26个大写字母,任意一个都可以匹配
var str='xoogle';
console.log(pattern.test(str)); //false 区分大小写
---------------------------------------------
var pattern=/[0-9]oogle/;
var str='44oogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/[0-9]*oogle/; //[0-9]*,表示0次,一次,或者多次
var str='44444oogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/[a-zA-Z0-9]oogle/; //[a-zA-Z0-9]表示匹配大小写的a-zA-Z0-9
var str='6oogle';
console.log(pattern.test(str));

---------------------------------------------
var pattern=/[^0-9]oogle/; //[^0-9]表示非0-9的任意字符
var str='boogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/^[0-9]oogle/; //这个^符号,是加在/后面的而不是[]里面的
var str='44444oogle';
console.log(pattern.test(str)); //false
---------------------------------------------
var pattern=/^[0-9]+oogle/; //+号可以匹配1个或者多个
var str='44444oogle';
console.log(pattern.test(str)); //true

---------------------------------------------
var pattern=/[a-zA-Z0-9_]oogle/; //写这么长太麻烦
var str='_oogle';
console.log(pattern.test(str));

这样写简单:
var pattern=/\woogle/; //\w表示 a-zA-Z0-9_
var str='_oogle';
console.log(pattern.test(str));


var pattern=/\Woogle/; //\W表示 非 a-zA-Z0-9_
var str='-oogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/\doogle/; //\d表示 [0-9]
var str='aoogle';
console.log(pattern.test(str)); //false

var pattern=/\Doogle/; //\d表示 [^0-9]
var str='aoogle';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/^google$/; //^ 强制首匹配,$ 强制尾匹配
var str='google';
console.log(pattern.test(str));

---------------------------------------------
空格匹配:

var pattern=/goo gle/; //直接使用空格匹配
var str='goo gle';
console.log(pattern.test(str));


var pattern=/goo\sgle/; //\s 表示空格匹配
var str='goo gle';
console.log(pattern.test(str));
---------------------------------------------
var pattern=/google\b/; //\b 表示到达边界
var str='googlesdfsdfsdfsd';
console.log(pattern.test(str)); //false
---------------------------------------------
var pattern=/google\b/; //\b 表示到达边界
var str='google';
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/google|baidu|bing/; //|表示匹配或选择模式
var str='this is a bing'; //匹配概念,不是相等,包含的意思
console.log(pattern.test(str)); //true
---------------------------------------------
var pattern=/google{4,8}$/; //表示e的4-8次
var str='googleeeeeeeeeeeee';
console.log(pattern.test(str));

---------------------------------------------
分组模式匹配:

var pattern=/(google){4,8}/; //分组,表示可以看成一个字符
var str='google'; //表示 google 4-8次
console.log(pattern.test(str));
---------------------------------------------

var pattern=/8.*8/;
var str='This is a 8google8';
console.log(pattern.test(str)); //true

var pattern=/8(.*)8/;
var str='This is a 8google8';
console.log(pattern.test(str)); //true
console.log(RegExp.$1); //google RegExp.$1表示获取模式中第一个分组对应的匹配字符串


var pattern=/8(.*)8/;
var str='This is a 8google8';
document.write(str.replace(pattern,'123')); //This is a 123

var pattern=/8(.*)8/;
var str='This is a 8google8';
document.write(str.replace(pattern,'<strong>google</strong>')); //This is a google

var pattern=/8(.*)8/;
var str='This is a 8google8';
document.write(str.replace(pattern,'<strong>$1</strong>')); //$1表示分组获取字符串匹配到

位置交换:
var pattern=/(.*)\s(.*)/;
var str='google baidu';
console.log(str.replace(pattern,'$2 $1')); //baidu google

---------------------------------------------

关于贪婪和惰性:

var pattern=/[a-z]/;
var str='abcdefj';
console.log(str.replace(pattern,'1')); //1bcdefj

var pattern=/[a-z]+/; //这里使用了贪婪模式
var str='abcdefj';
console.log(str.replace(pattern,'1')); //1 所有的字符串变成了1

var pattern=/[a-z]+?/; //使用惰性模式
var str='abcdefj';
console.log(str.replace(pattern,'1')); //1bcdefj 只有第一个字符变成了1,后面没有匹配

var pattern=/[a-z]+?/g; //使用惰性模式 开启全局
var str='abcdefj';
console.log(str.replace(pattern,'1')); //1111111


例子:
var pattern=/8(.*)8/; //使用了贪婪
var str='8google8 8google8 8google8'; //匹配到了 google8 8google8 8google
document.write(str.replace(pattern,'<strong>$1</strong>'));
//结果是:<strong>google8 8google8 8google</strong>

var pattern=/8(.*?)8/; //使用了惰性
var str='8google8 8google8 8google8';
document.write(str.replace(pattern,'<strong>$1</strong>')); //google 8google8 8google8

var pattern=/8(.*?)8/g; //使用了惰性,开启全局
var str='8google8 8google8 8google8';
document.write(str.replace(pattern,'<strong>$1</strong>')); //google google google
//这次结果正确了
//<strong>google</strong>
//<strong>google</strong>
//<strong>google</strong>

var pattern=/8([^8]*)8/g; //另一种惰性,屏蔽了8的匹配,也就是两边包含字符
var str='8google8 8google8 8google8';
document.write(str.replace(pattern,'<strong>$1</strong>')); //google google google

 

 

以下都是两个或两个以上的分组:

var pattern=/(\d+)([a-z])/; //这个叫做捕获性分组,所有的分组都捕获返回
var str='123abc';
var a=pattern .exec(str);
//a[0]返回123a
//a[1]返回123
//a[2]返回a

var pattern=/(?:\d+)(?:[a-z])/; //非捕获性分组,只要在不需要捕获返回的分组加上?:
var str='123abc';
console.log(pattern .exec(str));
//[123a]


var pattern=/(a?(b?(c?)))/; //嵌套分组,从外往内获取 很混乱,一般不用
var str='abc';
console.log(pattern.exec(str));
//第一步:a[0],整个匹配到的字符串abc
//第二步:a[1],匹配第一个分组(a?(b?(c?))),abc
//第三步:a[2],匹配第二个分组(b?(c?)),bc
//第四步:a[3],匹配第三个分组(c?),c

------------------------------------------------------------------------------

var pattern=/goo(?=gle)/; //goo后面必须是gle才能返回goo,这里一定要注意,返回的是goo,不是google
var str='goobb';
console.log(pattern.exec(str)); //null

var pattern=/goo(?=gle)/; //goo后面必须是gle才能返回goo,这里一定要注意,返回的是goo,不是google
var str='google';
console.log(pattern.exec(str)); //goo 返回的是goo,而不是google,这是前瞻性捕获

------------------------------------------------------------------------------

var pattern=/\[/; //用\符号来转义正则里的特殊字符,才能匹配
var str='[';
console.log(pattern.test(str)); //true

var pattern=/^\d+/g; //限定了首匹配
var str='1.baidu\n2.google\n3.bing';
console.log(str.replace(pattern,'#')); //只有第一行变成了#

var pattern=/^\d+/gm; //限定了首匹配,并且开启换行
var str='1.baidu\n2.google\n3.bing';
console.log(str.replace(pattern,'#')); //三行都换成了#

------------------------------------------------------------------------------

常用的正则:

1.检查邮政编码
var pattern=/[1-9][0-9]{5}/;
var str='This is 224000'; //必须是6位,必须是数字,第一位不能为0
console.log(pattern.test(str)); //true

2.检查文件压缩包
var pattern=/^[\w\-]+\.(zip|rar|gz)$/; //\w+,加上^来限定首字符开始匹配
var str='-123.zip'; //文件名:字母数字_.zip,gz,rar,7z
console.log(pattern.test(str)); //true

3.删除多余空格
var pattern=/\s/g;
var str='111 222 333 555';
console.log(str.replace(pattern,'')); //111222333555

4.删除首尾空格
var pattern=/^\s+/;
var str=' goo gle ';
var result=str.replace(pattern,'');
pattern=/\s+$/;
result=result.replace(pattern,'');
console.log(result);
以上方法比较笨

var pattern=/^\s+(.+?)\s+$/; //(.+)是贪婪模式,加?号就是惰性模式
var str=' goo gle ';
var result=pattern.exec(str)[1];
console.log(result);

使用惰性模式的分组:
var pattern=/^\s+(.+?)\s+$/;
var str=' goo gle ';
var result=str.replace(pattern,'$1');
console.log(result); //goo gle

5.简单的电子邮件验证
var pattern=/^([\w\.\-]+)@([\w\-]+)\.([a-zA-Z]{2,4})$/;
var str='gengxinnihaom@163.com'
console.log(pattern.test(str)); //true

 

判断邮箱:

function isAvailableEmail(sEmail) {
        let reg=/^[0-9a-zA-Z_.]{1,}@[a-zA-Z0-9_.]{1,}[a-zA-Z0-9]{2,4}$/
        return reg.test(sEmail)
      }
      let res=isAvailableEmail('0@0.az')
      console.log(res)
posted @ 2017-07-12 18:27  耿鑫  阅读(173)  评论(0编辑  收藏  举报