正则表达式
- 正则表达式
-
- 创建正则表达式
- 正则表达式对象的方法
- 常用字符串匹配的正则方法
- 元字符
-
- 修饰符
- 字符匹配
- 点通配符
- 方括号范围匹配
- 方括号字符反义
- 转义字符类
- 重复匹配
-
- 普通重复
- 重复次数范围 贪婪匹配
- 非贪婪匹配
- 开始和结束符
- `|` 或者
- 案例锦集:
- 群组
-
-
-
- 面试题
-
- 断言
-
- `"3 5="-->"3 5=8"`面试题
- 高级密码
- 中级密码
- 初级密码
- 重复次数
- 变量
- 增添addClass
- 删除removeClass
- 中文查询
正则表达式
正则表达式(regular expression)是描述字符模式的对象。 ECMAScript的RegExp类表示正则表达式。 而string和RegExp它们都定义了使用正则表达式进行强模式匹配和文本检索和替换的函数。
简单的模式可以是单独的字符。a 更复杂的模式包括更多的字符,可用于分析、格式检查、替换等。 您可以规定字符串中的检索位置,以及要检索的字符类型,等等。
正则表达式只是一个字符串。没有长度限制,但这种正则表达式的长度往往很短。以下是一些正则表达式的例子:
I had a \S day today [A-Za-z0-9\-_]{
3,16} \d\d\d\d-\d\d-\d\d v(\d )(\.\d )* TotalMessages="(.*?)" ]>
这些字符串实际上是微型计算机程序。 正则表达式的语法,实际上是一种轻量级、简洁、适用于特定领域的编程语言。
创建正则表达式
- 使用字面量创建:
var re = /a/
- 使用RegExp构造函数创建:
var re = new RegExp(“a修饰符);
- g 全局 从头查找到尾部
- i 不区分大小写
- m 支持换行操作
var reg=new RegExp("a","g"); console.log(reg.flags);//修饰符 console.log(reg.source);//正则内容
正则表达式对象的方法
方法 | 功能 |
---|---|
test() | 返回布尔值的方法是匹配字符串,匹配成功返回true,失败返回false |
exec() | 检索字符串中的指定值。返回值是被发现的值。如果没有发现匹配,则返回 null。 |
var reg=a/g;
console.log(reg.test("abac"));
console.log(reg.test("abac"));
console.log(reg.test("abac"));//false
console.log(reg.test("abac"));//重新从第一个开始查找
注意:
在一个正则对象使用test或者exec时,如果使用全局查找,将自动记录查找指针,同一个正则对象再次查找指针会继续上次的位置开始向后查找
常用字符串匹配的正则方法
方法 | 功能 |
---|---|
replace() | 用于替换,接受两个参数,第一个是匹配项,第二个可以是字符串或是一个函数 |
match() | 接受一个参数,正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null |
search() | 参数与match相同,返回字符串中第一个匹配项的索引,没有匹配项返回-1 |
Split() | 把字符串分割为字符串数组。 |
var str="abcdefB";
str=str.replace(/c/,"z");
console.log(str);//abzdefB
str=str.replace(/b|e/g,"z");//(或)全局 从头查找到尾部
console.log(str);
str=str.replace(/b|e/gi,"z");//i 不区分大小写
var str='{"a":1,"b":2,"c":3}';
str=str.replace(/"/g,"'");
console.log(str)
//{'a':1,'b':2,'c':3}
console.log("abacad".search(/a|d/g))
//0
console.log("abacad".match(/a|d/g));
['a', 'a', 'a', 'd']
console.log("a-b-c".split("-"));//['a', 'b', 'c']
console.log("a=b-c".split(/=|-/));//['a', 'b', 'c']
var str="abacad".replace(/c|d/g,"z");
console.log(str);//abazaz
var i=0;
var str="abacad".replace(/c|d/g,function(item,index,str){
console.log(item,index,str);
i++;
return i;
})
console.log(str)//aba1a2
var str = "abc345hh67";
var reg = /\d{2}/;
console.log(str.match(reg));//['34', index: 3, input: 'abc345hh67', groups: undefined]
console.log(str.search(reg));//3
console.log(str.replace(reg,"哈哈哈哈"));//abc哈哈哈哈5hh67
元字符
修饰符
修饰符 | 功能 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
字符匹配
正则表达式中包含了一系列的字符,这些字符只能匹配它们本身。有一些被称为“元字符”的特殊字符,可以匹配一些特殊规则。
如下所示的例子中,我用蓝色标出了元字符。
I had a \S+ day today
[A-Za-z0-9\-_]{
3,16}
\d\d\d\d-\d\d-\d\d
v(\d+)(\.\d+)*
TotalMessages="(.*?)"
]*>
大部分的字符,包括所有的字母和数字字符,是普通字符。也就意味着,它们只能匹配它们自己。例如:
cat
意味着,只能匹配一个字符串,以“c”开头,然后是字符“a”,紧跟着是字符“t”的字符串
不做特殊说明,正则表达式中是区分大小写的。但是,几乎所有正则表达式的实现,都会提供一个Flag用来控制是否区分大小写。
点通配符
- 这是我们第一个讲解的元字符,“.”相当于CSS中*,它意味着可以匹配所有的字符,称之为通配符。
/c.t/
就是第一个字符是c
,第二个字符是任意字符,第三个字符是t
。注意如果ct
,或者coot
是不符合规则的。/c\.t/
如果用\.
来描述,.在这里就不是通配符了,而是表示第一个字符是c
,第二个字符是.,第三个字符是t
- 这里的反斜杠其实也是元字符,表示把一些元字符恢复到原来的字符功能。
方括号范围匹配
例如
c[aeiou]t
第一个字符是c,第二个字符可以是a,e,i,o,u中的任意一个字符,第三个字符是t。- [012345679] 匹配数字中除了8以外的任意一个整数
[a]
匹配单一字符a[\[\]\ab]
仅匹配一个字符,[ 意味着匹配“[”,]意味着匹配“]”,\ab,意味着匹配一个a或者b的字符。[\\\[\]]
???这是什么
console.log('\\[]'.match(/\\\[\]/));// 输出:['\\[]', index: 0, input: '\\[]', groups: undefined]
console.log('\\[]');// 输出:\[]
[dabaaabcc]
注意这里出现了重复和顺序问题,这种写法其实没有任何意义,与[abcd]相同[.]
这种元字符是匹配.,与.单独出现是不同的。他表示必须匹配一个字符全角字符句号,与单独出现与.的作用也不相同,后者是一个.字符。/[.]/
代表字符. 不是通配符- 字符类描述的过程中可以省略中间值,用-直接连接首尾,例如[a-z]a-z的所有字符,[f-z]f-z的所有字符
[1-9]
1,2,3,4,5,6,7,8,9[A-Z]
大写的A到Z的所有字符匹配[0-9.,]
匹配0到9的任意数字或者全角句号或者逗号[0-9A-F]
匹配0到9的任意数字或者大写A到大写F的任意字符[0-9a-z\-]
匹配0-9,a-z的任意数组或者字符,或者-字符- 一般我们用
[]
这种字符类匹配是为了在匹配是某些字符可以是多个字符。所以单独使用[a]
与a
是一样的作用。
即使[A-z]在你使用的实现中,是合法的,也可能会产生无法预料的运行结果。
[1-31] 这是什么??1,2,3还是1-31。
[1-31] 匹配的是123中的某一项
console.log(/[{}]/);//匹配{ 和 }任意一个字符
方括号字符反义
[^]反义字符,表示除了^所描述的字符外的其他字符,类似于js中!的作用。
[^a]
[^a-zA-Z0-9]
[\^abc]
[^\^]
转义字符类
项目 | Value |
---|---|
\w |
查找单词字符。与[a-zA-Z_0-9]相同 |
\W |
查找非单词字符。[^0-9A-Za-z_]相同 |
\d |
查找数字。与[0-9]相同 |
\D |
查找非数字字符。与[^0-9]相同 |
\s |
查找空白字符。 |
\S |
查找非空白字符。 |
\b | 单词分割符 |
\B | 非单词分割符 |
console.log("ab cd ef".split(/\s/));//用空格切割
// ['ab', 'cd', 'ef']
console.log(" aja ajsn asd assd a a sa asd ".match(/\S/g).join(""));
重复匹配
m{n}
表示m重复n次
console.log(/1[3-9]\d\d\d\d\d\d\d\d\d/.test("13890876890"))
console.log(/1[3-9]\d{9}/.test("13890876890"))
普通重复
console.log(/ab{3}/) //abbb
console.log(/(ab){3}/) //ababab
console.log(/a{1}/)// 等价与/a/
console.log(/a{0}/)// 匹配""字符
console.log(/\d\d\d\d-\d\d-\d\d/)
console.log(/\d{4}(-\d{2}){2}/)
重复次数范围+贪婪匹配
{最低,最多}
console.log("caab".match(/ca{3,8}b/))//null
console.log("caaab".match(/ca{3,8}b/))
console.log("caaaaaaaab".match(/ca{3,8}b/))
console.log("caaaaaaaaab".match(/ca{3,8}b/))//null
console.log("a1231241231b".match(/a\d{1,20}b/));
console.log("a1b".match(/a\d{0,20}b/));//可以是:"ab","a1b";
//任意字符一位或者40位之间
console.log("a1283712387basvad18927318273v".match(/a.{1,40}v/g));//['a1283712387basvad18927318273v']
console.log("aaaaaaaa".match(/a{3,5}/g));// ['aaaaa', 'aaa']
不给最大值,表示无穷大(0个也好,无数也罢)
console.log("aaaaaaaaa".match(/a{0,}/g));//不给最大值,表示无穷大
console.log("a".match(/a{0,}/g));
//['a', '']
console.log("a".match(/a{0}/g));
//['', '']
console.log("a".match(/a{1}/g));
//['a']
console.log("colour".match(/colou{0,1}r/g));
//可有可无
所以就有了几种简写模式
{0,} _ * |
0个也好,无数也罢 |
---|---|
非贪婪匹配
在.
字符后面有*?
或者+?
通通称之为非贪婪匹配;
console.log("av1283712387basvad18927318273v".match(/a.+?v/g));
// ['av1283712387basv', 'ad18927318273v']
console.log("av1283712387basvad18927318273v".match(/a.*?v/g));
// ['av', 'asv', 'ad18927318273v']
console.log("中国的四大名著包括《西游记》、《三国演义》、《水浒传》、《红楼梦》".match(/《.+?》/g))
//['《西游记》', '《三国演义》', '《水浒传》', '《红楼梦》']
var str = "<p>Uber的这款无人车原型配备了多个<label>摄像头</label>、<em>激光雷达</em>以及<span>
传感器</span>,可看清100米范围内任何方向的东西</p><br/><p>第二行内容,哎嘿,第二行内容</p>"; str=str.replace(/<.+?>/g,function(item){ return item==="<br/>"? "\n" : ""; })
起始和结束符
项目 | Value |
---|---|
^ 起始 |
正则表达式开始的位置加入这个表示整个字符串必须以这个字符起始 |
/^a/ |
必须以a作为开始 |
$ 结束 |
正则表达式结束的位置加入这个表示整个字符串必须以这个字符结束 |
/a$/ |
必须以a结束 |
- 如果使用^和$ 可以约束整个字符串的长度限制
- 必须把^ 写在第一位处理
console.log(/^ab$/.test("ab"))//true
console.log(/b.{4}$/.test("asdhjasdbaaaa"));//匹配后几位是b的结尾
|
或者
注意:如果这里的写两个||表示对空字符也会做一个匹配 如果匹配成功,不会进行后面正则判断
console.log(/cat|dog/.test("dog"));
console.log(/cat|dog/.test("cat"));
console.log("abacad".match(/ab||ac/g));
console.log("abacad".match(/ab|ac|/g));
console.log("abacad".match(/|ab|ac/g));
true
true
['ab', '', '', '', '', '']
['ab', 'ac', '', '', '']
['', '', '', '', '', '', '']
/a|b/ 等价于 [a|b]
案例锦集:
/^[1-9]$|^[12]\d$|^3[01]$/
/^\d$|^[1-9]\d$|^1\d{2}$|^2[0-4]\d$|^25[0-5]$/
0.0.0.0-255.255.255.255
/^(\d|[1-9]\d|1\d{
2}|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d{
2}|2[0-4]\d|25[0-5])){
3}$/
群组
- ( )可以将部分正则内容作为一组使用
- 可以筛选出字符串中符合需求的部分
- 将括号里的东西放在这个获取数组的后面部分
例如:
var str="3<ab>";
console.log(str.match(/(\d+)<([a-zA-Z]+)>/))
var str="http://www.163.com/news/a/b/index.html";
console.log(str.match(/(https?:)\/\/([^\/]+)(.+\/)(.*)/));
match不允许群组的全局查找
var str="3[ab]12[cd]";
str=str.replace(/(\d+)\[([a-zA-Z]+)\]/g,function(item,a,b){
// console.log(item,a,b);
return b.repeat(a);
});
console.log(str)
//abababcdcd
var str="a=3&b=a&c=5&d=6"; var o={ }; str.replace(/(\w+)=([^&]+)/ 标签:
600g微型传感器6n