JavaScript正则表达式

模式修饰符

i   忽略大小写
g   全局匹配
m   多行匹配

正则表达式方法

test

alert(/Box/i.test('box'));          //true  写法一

var pattem = new RegExp('Box','i');
var str = 'box';
alert(pattern.test(str));           //true  写法二

exec

有就显示数组(只匹配第一个),没有就返回null

var pattem = /Box/i;                //忽略大小写
var str = 'box';
alert(pattern.exec(str));           //box

test&exec

开启全局匹配时,索引位置不会重置

var pattern = /box/ig;
var str = 'This is a Box!That is a box!';
alert(pattern.test(str));           //true
alert(pattern.lastIndex);           //13
alert(pattern.exec(str));           //box
alert(pattern.lastIndex);           //27

String对象的正则表达式方法

match

返回子串或null

var pattern = /Box/i;                       //忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.match(pattern));                  //Box   匹配到第一个字符串,返回数组

var pattern = /Box/ig;                      //全局匹配忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.match(pattern));                  //Box,box   匹配所有字符串,返回数组

返回第一个匹配的位置,从0开始计数,匹配不到返回-1

var pattern = /box/;
var str = 'This is a Box!That is a box!';
alert(str.search(pattern));                 //24

var pattern = /box/i;                       //忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.search(pattern));                 //10

var pattern = /xox/;
var str = 'This is a Box!That is a box!';
alert(str.search(pattern));                 //-1    匹配不到

replace

返回替换后的字符串

var pattern = /Box/;
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 = /!/;                          //匹配感叹号
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);           //3

var pattern = / /;                          //匹配空格
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);           //7

RegExp对象的静态属性

早期浏览器有差别,不常用
疑问:lastMatch等,全局时,是最后一次匹配的第一个匹配项,还是最后一个匹配项?

input($_)

存储当前被匹配的字符串

var pattern = /Box/;
var str = 'This is a Box!That is a box!';
alert(RegExp.input);                        //初始为空字符串
pattern.test(str);                          //使用一下正则
alert(RegExp.input);                        //This is a Box!That is a box!
//alert(RegExp['$_'])                      //其他写法,其他静态属性都有自己的短名
//alert(RegExp.$_)                         //其他写法,只有input可以这么写

leftContext($`)

最后一次匹配时,第一个匹配到的字符串的前子串

var pattern = /box/ig;                      //全局匹配忽略大小写
var str = 'This is a Box!That is a box!';
pattern.test(str);
alert(RegExp.leftContext);                  //This is a 

var pattern = /box/g;                       //全局匹配
var str = 'This is a Box!That is a box!';
pattern.test(str);
alert(RegExp.leftContext);                  //This is a Box!That is a 

rightContext($’)

最后一次匹配时,第一个匹配到的字符串的后子串

var pattern = /box/ig;
var str = 'This is a Box!That is a box a box!';
pattern.test(str);
alert(RegExp.rightContext);                 //!That is a box a box!

lastMatch($&)

最后一次匹配时,第一个匹配到的字符串

var pattern = /box/ig;
var str = 'This is a Box!That is a box a box!';
pattern.test(str);
alert(RegExp.lastMatch);                    //Box

lastParen($+)

最后一对圆括号内的匹配子串

multiline($*)

用于指定是否所有的表达式都用于多行的布尔值

RegExp对象的实例属性

早期浏览器有差别,不常用

global

Boolean值,表示g是否已设置

var pattern = /box/g;
alert(pattern.global);      //true

var pattern = /box/;
alert(pattern.global);      //false

ignoreCase

Boolean值,表示i是否已设置

var pattern = /box/i;
alert(pattern.ignoreCase);      //true

var pattern = /box/;
alert(pattern.ignoreCase);      //false

multiline

Boolean值,表示m是否已设置

var pattern = /box/m;
alert(pattern.multiline);       //true

var pattern = /box/;
alert(pattern.multiline);       //false

source

正则表达式的源字符串形式

var pattern = /box/g;
alert(pattern.source);          //box

lastIndex

整数,代表下次匹配将从哪里字符串位置开始

元字符

反斜杠后的元字符将失去其特殊含义,匹配特殊字符必须加反斜杠

元字符

.               匹配除换行符意外的任意字符
[A-Z]           匹配一个大写字母
[a-z]           匹配一个小写字母
[0-9]           匹配一个数字
[a-zA-Z0-9]     匹配一个大小写字母或数字
[^0-9]          匹配一个非数字
[^a-z0-9]       匹配任意一个不在括号中的字符集中的字符
\d              匹配数字
\D              匹配非数字,同[^0-9]
\w              匹配字母和数字及_
\W              匹配非(字母和数字及_)

空白字符

\0              匹配null字符
\b              匹配单词边界,不匹配字符
\f              匹配进制字符
\n              匹配换行符
\r              匹配回车字符
\t              匹配制表符
\s              匹配空白字符、空格、制表符、换行符
\S              匹配非空白字符

重复字符

?               匹配0个或1个
*               匹配0个或任意多个
+               匹配至少一个
{m}             匹配m个
{m,}            匹配m个,或m个以上
{m,n}           匹配最少m个,最多n个

锚字符

^               行首匹配
$              行尾匹配
\A              只有匹配字符串开始处
\b              匹配单词边界,词在[]内无效
\B              匹配非单词边界
\G              匹配当前搜索的开始位置
\Z              匹配字符串结束处或行尾
\z              只匹配字符串结束处

或’|’

aa|bb|cc        匹配aa或bb或cc中任意一个

分组,小括号()

(string)        括号内为一个整体

例:
var pattern = /8(.*)8(.*)6/;
pattern.test('This is a 8google81236');
alert(RegExp.$1);      //google    获取模式中第一个分组对应的匹配字符串
alert(RegExp.$2);		//123		获取模式中第二个分组对应的匹配字符串,$几表示第几个分组

例:在不清楚获取的字符串是啥时对其进行加粗
var pattern = /8(.*)8/;
var str = 'This is a 8google8';     //var str = 'This is a 8soso8';
document.write(str.replace(pattern, '<strong>$1</strong>'));
例:交换位置
var pattern = /(.*)\s(.*)/;
var str = 'google baidu';
alert(str.replace(pattern, '$2 $1'));//baidu google

贪婪和惰性

在重复字符后加?,会变成惰性匹配

var pattern = /[a-z]+/;             //贪婪
var str = 'abcdefg';
alert(str.replace(pattern, '1'));   //1

var pattern = /[a-z]+?/;            //惰性
var str = 'abcdefg';
alert(str.replace(pattern, '1'));   //1bcdefg

var pattern = /8(.*)8/;             //贪婪
var str = '8google8 8google8 8google8';
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>'));
//<strong>google</strong> 8google8 8google8

var pattern = /8(.*?)8/g;               //惰性,开启全局。
//var pattern = /8([^8]*)8/g            //另一种惰性写法
var str = '8google8 8google8 8google8';
document.write(str.replace(pattern, '<strong>$1</strong>'));
//<strong>google</strong> <strong>google</strong> <strong>google</strong>

捕获性分组和非捕获组?:

var pattern = /([a-z]+)\s([0-9]{4}$)/; //捕获性分组,括号匹配的字符串会捕获到数组
var str = 'google 2012';
var a = pattern.exec(str);          //返回长度3的数组
alert(a[0]);                        //google 2012   匹配到的字符串
alert(a[1]);                        //google        第一个分组括号的字符串
alert(a[2]);                        //2012          第二个分组括号的字符串

var pattern = /(?:[a-z]+)\s([0-9]{4}$)/;   //不想捕获到数组,就在括号内最开始加?:
var str = 'google 2012';
alert(pattern.exec(str));                   //google 2012,2012

非捕获组?=、?<=

肯定式向前查找?=、肯定式向后查找?<=(这个试不成功)

var pattern = /goo(?=gle)/;     //goo后面必须跟gle
//等价于var pattern = /(?=google)goo/;
var str = 'google';
alert(pattern.exec(str));       //goo

var pattern = /goo(?=gle)/;     //goo后面必须跟gle
var str = 'googee';             //goo后面没有gle
alert(pattern.exec(str));       //null

非捕获组?!、?

var pattern = /goo(?!gee)/;     //goo后面不能跟gee
var str = 'google';             //goo后面是gle
alert(pattern.exec(str));       //goo

var pattern = /goo(?!gee)/;     //goo后面不能跟gee
var str = 'googee';             //goo后面是gee
alert(pattern.exec(str));       //null

数组嵌套分组

var pattern = /(a?(b?(c?)))/;
var str = 'abc';
alert(pattern.exec(str));       //abc,abc,bc,c

换行模式

var pattern = /\d+/;
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#'));    //#.baidu\n2.google\n3.bing

var pattern = /\d+/g;               //开启全局
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#'));    //#.baidu\n#.google\n#.bing

var pattern = /^\d+/g;              //开启全局,限定开始位置
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#'));    //#.baidu\n2.google\n3.bing

var pattern = /^\d+/gm;             //开启全局,多行模式,限定开始位置
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#'));    //#.baidu\n#.google\n#.bing
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值