javaScript正则表达式

javaScript 与正则表达式

javaScript中,正则表达式是描述字符模式的对象

javaScript中与正则有关的语法:

定义正则表达式对象

var regPattern=new RegExp(pattern,modifiers);//模式串,修饰符
var regPattern=/pattern/modifiers;

其中pattern为字符串,不用加引号

对象属性

constructor

返回一个函数,函数为创建当前正则表达式对象的原型

var p=/e/i;
document.write(p.constructor+"\n"+p.constructor());

运行结果

	function RegExp() { [native code] } /(?:)/
global

判断当前正则表达式是否设置g(全局匹配)修饰符

var a=/e/g;
var b=/e/i;
document.write(a.global+"\n"+b.global+"\n");

运行结果

true false
ignoreCase

判断当前正则表达式是否设置i(大小写不敏感)修饰符

var a=/e/g;
var b=/e/i;
document.write(a.ignoreCase+"\n"+b.ignoreCase+"\n");

运行结果:

false true
lastIndex

规定当前正则表达式下一次匹配的起始位置

注意设置修饰符g后才可以使用

lastIndex可以修改并记录test和exec函数最后一次匹配成功的模式串的首地址,以便下次调用test时从上一次的位置继续,如果test或者exec函数找不到匹配则将lastIndex置0

var text="long live xdu!Long Live Xi'an"
			var pattern=/live/ig;
			while(pattern.test(text)==true){
				document.write("now index= "+pattern.lastIndex);
				document.write("<br/>");
			}
			document.write("now index= "+pattern.lastIndex);

运行结果:

now index= 9
now index= 23
now index= 0

如果已经执行了一次pattern.test(text),那么lastIndex=9,此时如果想要改搜索模式long,要手动将lastIndex调0

multiline

判断当前正则表达式对象是否设置m(多行匹配)修饰符

source

返回当前正则表达式对象模式匹配所用的模式pattern

var regPattern=new RegExp(pattern,modifiers);//模式串,修饰符
var regPattern=/pattern/modifiers;

就是这里的pattern

var reg=new RegExp("empire","g");
document.write(reg.source);

运行结果:

empire

修饰符modifiers

i

大小写不敏感

g

全局匹配,如果没有设置g则默认在找到第一个匹配之后停止

m

多行匹配

联用

直接写在一起,不用加任何运算符,顺序无所谓

比如/iter/ig就是一个全区匹配忽略大小写的正则表达式,/iter/gi与它等效

对象方法

exec(string)

检索字符串中是否有符合匹配的值(实例化正则表达式对象时的模式),有则返回该值,无则返回null

var a=/e/i;
document.write(a.exec("abcdfg")+"\n");
document.write(a.exec("abcd fged")+"\n");

运行结果:

null e

test()

检测某个字符串是否匹配当前模式,是则返回true,否则返回false

var a=/iter/i;
document.write(a.test("iteartor")+"\n");
document.write(a.test("iterator")+"\n");

运行结果:

false true

toString()

返回正则表达式字符串

var a=/iter/i;document.write(a.toString());

运行结果:

/iter/i

支持正则表达式的String对象方法

str.search(searchValue)

在当前字符串对象中查找与参数匹配的子串或者正则表达式,如果存在,则返回首个匹配的首地址,否则返回-1

var str="it Iterator iter";
document.write(str.search(/iter/i));

运行结果:

3

str.match(regexp)

在当前字符串对象中查找与参数匹配的子串或正则表达式,如果成功则返回匹配的模式,否则返回null

var str="it iterator iter itself";
ar arr=str.match(/it/g);
for(var i=0;i<arr.length;i++){
	document.write(arr[i]+"\n");
}
			

运行结果:

it it it it

应用:判断当前浏览器的UA(userAgent)标识

比如如果要判断是否是谷歌浏览器:

var ua=navigator.userAgent.toLowerCase();
document.write(ua.match(/Safari/i)+"\n");
document.write(ua.match(/Chrome/i)+"\n");
document.write(ua.match(/Tencent/i)+"\n");

谷歌浏览器的运行结果:

safari chrome null

查表可知谷歌浏览器的ua标识中确实含有safari字样

浏览器UA标识

腾讯TT
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)

Chrome 17.0 – MAC
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11

safari 5.1 – MAC
User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

safari 5.1 – Windows
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

str.replace(searchValue,replaceValue)

查找并替换当前字符串对象中与参数匹配的部分

var text="iterator Iter iter it itself iterators"
var newText=text.replace(/iter/gi,"reti");
document.write(newText);

运行结果:

retiator reti reti it itself retiators

str.split(separator,limit)

将当前字符串对象按照参数separator分裂成不超过limit个子串(如果limit不填则无限制),返回子串数组

var text="iteriterIteriterator"
var arr=text.split(/it/ig);
for(var i=0;i<arr.length;i++){
		document.write(arr[i]+" \n");
}

运行结果:

er er er erator

正则表达式语法

元字符

普通字符

.

点号用于查找一个字符,不包括换行'\n'和行结束符'\r'

如果匹配包括’\n’则使用模式"(.|\n)"

比如给定一串文字,查询其中具有的结构e....e

意义 开头必须是e,结尾必须是e,中间四个除了换行和回车无所谓(包括数字,字母,标点,空格等等)是啥,

var reg=new RegExp("e....e","g");
var str="e\neye\neare\nexplore\nempire\nexercise";
document.write(str.match(reg));

运行结果:

empire,ercise
\w

用于查找单词或者字母,排除标点,空格等

var reg=/\w/g;
var str="123sa&456%dsf";
document.write(str.match(reg));

运行结果:

1,2,3,s,a,4,5,6,d,s,f
\b

匹配单词开头或者结尾

var reg=/\bab/g;
			var str="abstract\nabsolute\naccent\naccount";
			document.write(str.match(reg));

运行结果:

ab,ab
\d

匹配数字,一个\d匹配一个数字

比如匹配四个连着的数字结构

var reg=/\d\d\d\d/g;
			var str="1 12 123 1234 54321 a ab abc abcd abcde";
			document.write(str.match(reg));

运行结果

1234,5432
^

匹配单词开始

$

匹配单词结束

重复限定符

*

重复0次或多次

比如匹配e开头e结尾的单词:

var reg=/^(e)\w*(e)$/g;
			var str="empire";
			var str2="expand";
			document.write(str.match(reg)+"\n"+str2.match(reg));

运行结果:

empire null
+

重复一次以上

匹配至少一个x开头,至少一个y结尾的字符串

var reg=/^x+y+$/g;
			var str="xxxy";
			document.write(str.match(reg));
?

重复至多一次

{n}

\d{8}表示有连续8位都是数字的结构,

[a-z]{8}表示有连续8位都是小写字母的结构,

匹配1开头的11位手机号:

var reg=/^1\d{10}$/g;
			var str="12345678987";
			document.write(str.match(reg));

运行结果

12345678987

重复n次

{n,}

重复n次以上

{n,m}

重复n到m次

非打印字符

字符作用
\cx匹配组合键,比如\cA匹配ctrl+A
\f匹配换页符
\n匹配换行符
\r匹配回车符
\s匹配任何空白字符,[\f\n\r\t\v]
\S匹配任何非空字符
\t匹配制表符
\v匹配垂直制表符

进阶用法

字符簇

[abc]

查找任何写入方块的字符,相当于同时对满足条件的字符应用exec,match等函数

var reg=new RegExp("[empire]","g");
var str="emplace emphasize spire";
document.write(str.match(reg));

运行结果

e,m,p,e,e,m,p,i,e,p,i,r,e

方括号内还可以这样写:

[a-h]包括从a到h的所有字符

[5-9]包括从5到9的所有字符

[^abc]

^标识查找不包括在方括号中的字符(键盘可以敲出来的所有字符包括空格,标点,数字,字母等等)

var reg=new RegExp("[republic]","g");
var dreg=new RegExp("[^republic]","g");
var str="resize report purple black italic";
document.write(str.match(reg));
document.write("<br/>");
document.write(str.match(dreg));

运行结果:

r,e,i,e,r,e,p,r,p,u,r,p,l,e,b,l,c,i,l,i,c
s,z, ,o,t, , ,a,k, ,t,a

分组

(组内视为整体)

如果要求匹配至少一组xy开头的字符串

显然只用+是达不到要求的

var reg=/^(xy)+/g;
			var str="xyxyxyxy";
			var str2="xzyxz";
			document.write(str.match(reg));
			document.write("<br>/");
			document.write(str2.match(reg));

运行结果:

xyxyxyxy
/null

转义

如果应用分组了,但是组内本来就有小括号字符,则将组内要匹配的小括号前加上转移字符\

条件或

条件1|条件2|...

如果要匹配所有联通电话号码,联通的电话号开头有130/131/132/155/156/185/186/145/176等号段

这时可以

^(130|131|132|155|156|185|186|145|176)\d{8}$
var reg=/^(130|131|132|155|156|185|186|145|176)\d{8}$/g;
			var str="13053816523";
			var str2="99953816523";
			document.write(str.match(reg));
			document.write("<br/>");
			document.write(str2.match(reg));

运行结果:

13053816523
null

高级用法(待学)

零宽断言

正向先行断言
正向后行断言
负向先行断言
负向后行断言

捕获和非捕获

反向引用

贪婪和懒惰

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰球球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值