文章目录
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.11safari 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.50safari 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
高级用法(待学)
零宽断言
正向先行断言
正向后行断言
负向先行断言
负向后行断言
捕获和非捕获
反向引用
贪婪和懒惰