首页 > 代码库 > 正则表达式1

正则表达式1

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

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


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


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

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

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


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

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

测试正则表达式:

方法 功能

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

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

var pattern=new RegExp(‘Box‘,‘i‘); //区分大小写
var str=‘box‘;
alert(pattern.test(str)); //true

------------------------------------------------------------------------
一句话匹配:
alert(/Box/i.test(‘box‘)); //true
------------------------------------------------------------------------

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

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

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

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

------------------------------------------------------------------------
使用字符串的正则表达式方法:
除了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!‘;
alert(str.match(pattern)); //Box,Box 返回的是一个数组

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

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

search:

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


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

replace:

var pattern=/Box/i; //没有开启全局
var str=‘This is a Box! That is a Box!‘;
alert(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!‘;
alert(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!‘;
alert(str.split(pattern)); //This is a Box, That is a Box,

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

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

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

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

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

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

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


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

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


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

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

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

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

---------------------------------------------
var pattern=/go*gle/; //o*,表示0个,1个,或者多个o
var str=‘ggle‘;
alert(pattern.test(str)); //true
---------------------------------------------
var pattern=/go+gle/; //o+,表示1个,或者多个
var str=‘google‘; //至少要写一个o
alert(pattern.test(str));
---------------------------------------------
var pattern=/go?gle/; //o?,表示1个,或者0个
var str=‘google‘;
alert(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‘;
alert(pattern.test(str)); //true
---------------------------------------------
var pattern=/go{3}gle/; //o{3},表示只能限定为3个
var str=‘gooogle‘;
alert(pattern.test(str)); //true
---------------------------------------------
var pattern=/go{3,}gle/; //o{3,},表示为3个或3个以上
var str=‘goooogle‘;
alert(pattern.test(str)); //true
---------------------------------------------
var pattern=/[a-z]oogle/; //[a-z]表示26个小写字母,任意一个都可以匹配
var str=‘xoogle‘;
alert(pattern.test(str)); //true

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

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

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

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


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

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

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

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


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

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

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

var pattern=/8.*8/;
var str=‘This is a 8google8‘;
alert(pattern.test(str)); //true

var pattern=/8(.*)8/;
var str=‘This is a 8google8‘;
alert(pattern.test(str)); //true
alert(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‘;
alert(str.replace(pattern,‘$2 $1‘)); //baidu google

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

关于贪婪和惰性:

var pattern=/[a-z]/;
var str=‘abcdefj‘;
alert(str.replace(pattern,‘1‘)); //1bcdefj

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

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

var pattern=/[a-z]+?/g; //使用惰性模式 开启全局
var str=‘abcdefj‘;
alert(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

正则表达式1