正则 :
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),
可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
1.定义正则表达式:
a.普通方式:var reg=/表达式/附加参数
附件参数:
g:代表可以进行全局匹配。
i:代表不区分大小写匹配。
m:代表可以进行多行匹配。
例子:
var reg=/a*b/;
var reg=/abc+f/g;
b.构造函数方式:var reg=new RegExp(“表达式”,”附加参数”);
例子:
var reg=new RegExp(“a*b”);
var reg=new RegExp(“abc+f”,”g”);
两者区别:
a.普通方式中的表达式必须是一个常量字符串,而构造函数中的表达式可以是常量字符串,
也可以是一个js变量,例如根据用户的输入来作为表达式参数等等:
var reg=new RegExp(document.forms[0].exprfiled.value,”g”);
b.安卓端正常,IOS端会不零宽断言,会有如下报错:
//Invalid regular expression: invalid group specifier name
常用零宽断言:?<=、?<!、?!、?=
c.ios端有些环境不支持 / / 表达式的正则,但是都支持 new RegExp()构造函数
表达式对象(RegExp)方法:
1.exec(str),返回str中与表达式相匹配的第一个字符串,而且以数组的形式表现,
当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:
var regx=/\d+/;
var rs=regx.exec(“3432ddf53”);
返回的rs值为:[3432]
2.test(str),判断字符串str是否匹配表达式,返回一个布尔值。例如:
var regx=/user/d+/g;
var flag=regx.test(“user12dd”);
flag的值为true。
字符串String 对象方法:
1.match(expr),返回与expr相匹配的一个字符串数组,如果没有加参数g,
则返回第一个匹配,加入参数g则返回所有的匹配
例子:
var regx=/user\d/g;
var str=“user13userddduser345”;
var rs=str.match(regx);
rs的值为:[user1,user3]
2.search(expr),返回字符串中与expr相匹配的第一个匹配的index值。
没有匹配项时,返回-1,search() 方法不执行全局匹配,它将忽略标志 g
例子:
var regx=/user\d/;
var str=“user13userddduser345”;
var rs=str.search(regx);
rs的值为:0
3.replace(expr,str),将字符串中匹配expr的部分替换为str。
另外在replace方法中,str中可以含有一种变量符号$,格式为$n,
代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
进行全局替换(此时表达式必须附加参数g,否则也只是替换第一个匹配)
例子:
var regx=/user\d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);
rs的值为:003userddd0045
例子2:
var regx=/u(se)r\d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”$1”);
rs的值为:se3userdddse45
字符组:
\b:代表着单词的开头或结尾,作为单词的分界处。
\d就是[0-9]。表示是一位数字。
\D就是[^0-9]。表示除数字外的任意字符。
\w就是[0-9a-zA-Z_]。表示数字、大小写字母和下划线。
\W是[^0-9a-zA-Z_]。非单词字符。
\s是[ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。
\S是[^ \t\v\n\r\f]。 非空白符。
[]的使用: //很多元字符在字符组内都变成了普通字符
[abcdef] 这个正则表达式匹配abcdef中其中一个字母,
[.?!]这个正则表达式匹配里面三个标点符号中的其中一个。
[0-9]匹配0到9这段区间中任意一个数字(包括0和9)。
[a-z]这里就是匹配a到z这段区间其中一个字母
[0-9a-zA-Z]就是匹配 0到9、a到z、A到Z 这三个区间的其中一个区间的其中一个字符或数字
[\s*]表示空格或者*号。
[^0-9]表示除数字外的任意字符。
量词:
{m,} 表示至少出现m次。
{m} 等价于{m,m},表示出现m次。
? 等价于{0,1},表示出现或者不出现。记忆方式:问号的意思表示,有吗?
//eg:a\d? 匹配的是以字符a开头的,后面跟着0个或一个数字的字符串:a、a5、a9
+ 等价于{1,},表示出现至少一次。记忆方式:加号是追加的意思,得先有一个,然后才考虑追加。
* 等价于{0,},表示出现任意次,有可能不出现。
*
分支
(p1|p2|p3),其中p1、p2和p3是子模式,用|(管道符)分隔,表示其中任何之一
//eg:020-88888888 (020)88888888。要让让这两种形式的写法都可以匹配,我们就要写两种形式的正则表达式
//匹配020-88888888 的正则表达式可以写为:0\d{2}-\d{8};
//匹配(020)88888888的正则表达式我们可以写成:(0\d{2})\d{8}。
//如果要使这两个正则表达式一起匹配一个字符串,
//那么就要用到“或”符号来连接他们了:0\d{2}-\d{8}|(0\d{2})\d{8} 。
林宽断言
1.先行断言 也叫零宽度正预测先行断言(?=表达式) 表示匹配表达式前面的位置
2.后发断言 也叫零宽度正回顾后发断言 (?<=表达式) 表示匹配表达式后面的位置
负向零宽断言 (?!表达式) 也是匹配一个零宽度的位置,不过这个位置的“断言”取表达式的反值,例如 (?!表达式) 表示 表达式 前面的位置,如果 表达式 不成立 ,匹配这个位置;如果 表达式 成立,则不匹配:同样,负向零宽断言也有“先行”和“后发”两种,负向零宽后发断言为 (?<!表达式)
3.负向零宽后发断言(?<!表达式)
4.负向零宽先行断言 (?!表达式)
负向零宽断言要注意的跟正向的一样