正则表达式 都是 操作字符串的 说白了,找到符合规则的字符串
正则表达式 是由普通字符(26个英文字母、数字等) 和 特殊字符(. \)组成的文字模式
该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板
将某个字符模式与所搜索的字符串进行匹配。
作用: 查找 替换 数据有效性验证
创建正则表达式 两种方式
1,字面量 两个反斜线 var a = /内容/;
2,构造函数 var a = new RegExp();
正则表达式如何匹配字符串?
普通字符(字母、数字、下划线、汉字、空格、没有特殊含义的标点符号)
特殊字符(. \)
两个方法: 正则默认区分大小写
test(); 如果找到匹配内容就返回 true 找不到返回false 【模式是否匹配到字符串】
exec(); 方法返回的是数组,如果找到匹配内容就会将内容放到数组中,返回这个数组。
可以确定找到的个数和是否找到.找不到返回 null ;
可以组合使用
使用构造函数时,想要修饰模式。需要将修饰符作为第二个参数传递进去。
创建正则两种方式 字面量 构造函数 使用正则两个方法 test exec返回值不同 正则修饰3个 i g m 不区分带小写,全局,多行
=======================================================================
字面量方式和构造函数方式 创建 正则表达式有什么区别?我们应该使用哪一个?
区别在于,字面量创建方式我们不能根据需要改变规则。
构造函数方式可以,因为参数时字符串。字符串是可以以改变的。
================================================================
正则表达式测试工具
需求,输入字符串,输入匹配规则,选择是否忽略大小写,然后进行匹配,返回结果
简单的转义字符
转义字符: \ 反斜杠 将字符转换成别的含义 / 在正则中代表边界 使用 \/ 才能让他代表自身(正斜杠)
特殊字符想要匹配本身含义 都需要加转义符号 \
反斜杠是转义字符 想要使用它 首先就要将他转义,如果想在字符串中表示两个反斜杠 需要写成 \\\\
想要匹配特殊字符需要转义 想要匹配特殊字符自身 也需要转义
\n 代表换行
\t 代表tab 制表符
在匹配的时候我们还可以使用16进制编码 和 unicode编码方式去匹配
16进制: \x + 16进制编码
unicode : \u + unicode编码
========================================================================
字符类 用 [ ] 表示,里面是若干个字符(普通字符特殊字符都可以),匹配的时候只会匹配其中的一个。
例如字符串 str = 'hajs'; 正则 var pattren = /[sajk]/;
则会先用s进行匹配,匹配到返回,匹配不到在用a进行匹配,以此类推。
字符类,按照其中一个字符进行依次进行匹配,匹配到了就返回。
其实就是匹配字符串,如果你里面存在我定义在字符类中的字符就返回。
我们还可以取反,利用 ^ 符号,表示出了这个字符都匹配,例如 [^ab] 匹配除了ab以外的其他所有字符。
字符类含有一个强大的作用,就是可以在字符类中定义范围。
例如[a-z] 就可以对a-z的字符进行匹配,这个范围还可以用16进制,或unicode码来表示。
注意一点,我们写的一定要是一个范围。。。从小到大 ,相等也行。。不能前面比后面大。
匹配中文字符,只需要将代表中文字符的范围写在 字符类中就可以了。虽然不能知道具体是哪一个字符,但
能够确定你的字符串中是否存在中文。。。
中文的unicode编码范围是 4e00 - 9fa5 写法是 [\u4e00-\u9fa5]
范围之间不用逗号间隔 不需要间隔
还可以匹配数字
组合匹配
=======================================================
常用的字符类
/ . / : . 除了换行符以外,全部能够匹配到。 想要匹配这个 . 因为他是特殊字符,所以我们要把它转义 用 \.
===============================================================
\w 等价于 [a-zA-Z0-9_] : 意思就是匹配 大小写字符,数字和下划线。
我们可以对他进行取反[^a-zA-Z0-9_] 除了字母,数字,下划线都匹配 对应的就是 \W
一般大写的都表示的是小写的取反
==================================================================
\d : 匹配数字,相当于[0-9] \D 代表除了数字以外
===================================================================
\s : 匹配空格和制表符 \S 除了空格制表符,都匹配
注意字符类 [ ] 他只能匹配其中的一个,如果你想匹配多个就不能写在这里面
总结:学习了字符类 写在[]中,只会匹配其中的一个(特点),然后学习了常用的字符类的转义表示
. 除了换行\n 都匹配;\w匹配大小写字母,数字,下划线,大写W与他相反;\d 匹配的是数字;\s 匹配
的是空格和制表符 大写就是取反。
重复 正则中的量词
上面的代码,我们要匹配其中的数字。数字是\d,三个数字就需要写三遍,如果是几百个就要写几百遍,此时就用到了量词。
量词写在 { } 中,向匹配几个就写几个。如下:
除了指定匹配的个数,我们也可以写范围 匹配几个或几个 例如{1,2} 匹配一个或两个 1-2
如果我想匹配至少一个 需要写成 {1,} 写成 {1} 代表只匹配一个。 有下线
? 代表匹配一次或0次
+ 代表至少匹配一次
* 可以是0次或更多
{3}匹配三个
{1,} : 匹配一个或者多个 +
{0,1} :匹配0个或1个 ?
{0,} :匹配0个或者多个 *
========================================================================
非贪婪的重复
正则表达式,默认情况下都是贪婪的(这个贪婪只和量词有关),也就是说默认是匹配多个
只要条件允许,就会尽量多的去匹配
非贪婪匹配 只需要在量词后面加一个问号 ?
非贪婪匹配是在条件允许的情况下,进行非贪婪。匹配是从字符串的左到右
上面的例子,如果只匹配一个a,则b就匹配不上了。所以会匹配多个a?
所有上面才会匹配三个a 而不是ab
上面的例子,不加问号就是贪婪匹配。他匹配到的内容就是整个字符串。
只要在其中加一个问号,就会变成非贪婪匹配只匹配一个。为什么这么写,因为与量词有关,只能写在量词后面?
===================================================================
选择、分组及引用
--------------------------------------------------------------------------------
选择 | 表示 匹配其中的某一个,一旦匹配上,剩余的就不匹配了
上面的代码就是选择匹配,匹配字符串中的字符(或者是html,或者是css,或者是js)。
只要字符串中存在这里面的其中一个就返回这个字符,按照字符串顺序,从左向右 ,匹配到其中
一个就返回。。。上面的是返回css 因为css第一个被匹配到。。。
注意,是用这三个共同去匹配。而不是一个一个去匹配,如果是那样,返回的就是html了
上面这段代码返回的结果是 a 因为是从左到右匹配,肯定先匹配到 单个的a 就会返回,后面的不会执行
选择匹配,只会选择其中的一个条件去匹配字符串
---------------------------------------------------------------------------------------
分组
/ab/ 表示的是匹配ab,因为没有量词值匹配一个ab。如果改成 /ab+/ 这里就要注意,+代表1个或多个
他只影响他前面的字符 b 。也就是说代码中的正则表示的是,匹配一个a(定死)和一个b到多个b。所以
返回的是ab,,,而不是把两个都返回。
分组 用括号表示,括号内的字符 作为一组来处理。。
如果我们不想向上面那样,把ab也单拎出来进行匹配 只需要在ab的前面加上?: 即可。
写法 : /(?:ab)c/
上面这段代码,我们给ab进行了分组。 后面的 \1 就代表前面的分组中的内容ab(不是表示两个一样的分组)。
相当于: /(ab) cd ab/
上面的 \1 其实就是分组的引用,引用第一个分组。他能保证 第一个分组匹配到的内容 和 引用分组匹配到的
内容是一致的。
看上面的代码,第一个分组匹配到的,是第一个间括号中的内容。用 \1 应用它之后 就能保证 最后一个间括号中
匹配到的内容,和第一个分组中是一样的。
使用exec 方法进行匹配,会返回匹配到的字符串。无论多少个被匹配到,他也只会保存一个。
如果用分组的话,就不是一个值。也就是匹配值,加上分组匹配值。
这个数组有两个属性:
index: 代表的是匹配到的值的 在字符串中的 起始位置
input: 代表被匹配的字符串 会被完整的存入这个数组。
位置匹配: 指定匹配的位置
===================================================================
首匹配 ^ 代表从开头进行匹配, /^j/ 代表匹配j 但是这个j 必须是字符串的开头。这就是首匹配。
只影响后面的一个字符。
=======================================================================
末尾匹配 $ 在正则要匹配的末尾字符后面添加 $ 符号。写法: \ab&\ 表示匹配的末尾一定要是b
以上是位置匹配的首尾匹配 首 ^ 尾 $
=========================================================================
位置匹配之单词边界匹配
\b 代表单词边界 ,也就是说他会匹配到 一个单词(单词的特点,前面没有字母,后面空格;两边都是空格;前面空格后面没有字母 ) \b 就代表单词边界。我只需要记住他会匹配到一个单词就可以。
上面就是保证className是一个单词的写法。。注意 \ 是转义字符,想要在构造函数中表示真正的 \d 需要使用转义 \\b
==========================================================================
前瞻性匹配 : (?= )
这里的 (?=script) ,上面的正则表示匹配 java 字符串,但是 java的后面一定要是 script。这就是前瞻性匹配。
字符串(?=内容) ;代表的是匹配这个字符串,但是字符串后面一定要是指定内容,最后匹配到的结果还是这个字符串。
负前瞻性匹配 : (?! ) 与上面相反,如果后面是这个指定的字符,我们就不匹配。
如上代码,表示 如果java后面是 script的话就不匹配。如果不是就匹配,,所以上面返回java 因为后面不是script,进行匹配。
前瞻性 条件符合就匹配。
负前瞻性 条件符合就不匹配。
RegExp 对象的实例方法
利用构造函数创建正则表达式 传转义字符的话 需要双重转义
注意在构造函数中 想要匹配反斜杠 \ 需要写四个反斜杠才能匹配一个反斜杠 \\\\
=========================实例方法(对象方法)==============================
模式修饰符 g :全局匹配
上面的说法 实在使用全局匹配g 修饰之后。
================================================================
test方法 全局匹配时,lastIndex值会发生变化 非全局匹配时 一直都是0
test方法运行的原理和 exec是一样的,全局匹配时也存在 lastIndex值的变化。匹配到的话返回的结果是true。匹配不到是false。
其他的几个方法如下:
RegExp对象的实例属性和构造函数属性。
===============================================================
实例属性: var pattern = /aa/igm;
pattern.ignoreCase 返回值 布尔型 判断是否区分大小写,不区分返回true
pattern.global 返回值布尔 判断是否全局匹配,全局匹配返回 true
pattern.multiline 返回值 布尔 判断是否多行匹配 多行匹配返回 true
pattern.source 返回字面量 字符串形式
pattern.lastIndex 在全局匹配时,返回的是查找的位置(第一次是0,第二次是第一次匹配到的字符串后面的位置)
如果不是全局匹配,lastIndex一直是0
================================================================
构造函数属性 正则表达式的构造函数 是RegExp 他的属性就是 RegExp.属性
注意:只有我们执行了,正则的实例方法。构造函数属性才有意义。
RegExp.input : 表示待匹配的字符串 别名是 $_ RegExp.$_
RegExp.lastMatch : 最近一次 匹配到的字符 别名是 $& RegExp[$&] 所有能用点 写的属性,都可以写在中括号中。
RegExp.leftContext : 表示上一次匹配到的字符,左边的字符
RegExp.rightContext : 表示上一次匹配到的字符,右边的字符(剩余的字符)
RegExp.lastParen : 表示最近一次匹配的,子选项。。也就是分组匹配到的内容
获取分组中的内容:使用exec方法 ,分组中匹配到的内容就会 保存在返回的数组中。
使用构造函数的属性 RegExp.$1 -- $9 ,可以获取到分组中的内容,代表的是对分组的引用,引用1 到 9
string 对象中与正则相关的方法
===================================================================
string.search(正则) : 检索字符串中与模式相匹配的值 返回值是匹配到的第一个字符的位置,没有匹配到返回 -1
有无全局匹配是没变化的
=====================================================================
string.match(正则) :找到1个或多个与正则匹配的字符串(一个或多个取决于是否全局匹配。默认就返回一个,全局就返回
多个)。结果是放在字符串中的,多个也会一次性找出来放在字符串中,不像exec,一次一次的找。
match 与 exec方法区别 匹配的话match 全局一次都找出来,exec是一次一次的找。
exec方法会将分组内容也找出来,而match方法在全局匹配时并不会将分组内容找出来返回。
上面的内容很重要
==================================================================================
string.split() : 用指定的字符分割字符串,返回分割后的字符串数组。
例如有字符串 'html,js,css' str.split(',') ; 表示以逗号分割字符串,返回的数组是['html','js','css' ]
这个参数也可以是正则表达式,按照正则的要求去分割字符串。
则上面的正在则 可以写成 \s代表的是空格 上面图片中书写错误
/\s*,\s*/ 放在split方法中,代表的就是。用 逗号,前后可以有空格或者无空格,去分割字符串
==============================================================
string.replace(正则,aaa) : replace 替换,用aaa替换掉与正则表达式相匹配的字符串,返回值是替换后的新字符串
我们可以用字符串,来确定要替换的对象。但是字符串方法,只能替换一个。
正则默认也是替换一个,全局匹配的话才能够全部替换。
引用
****************************************************************************************
replace 方法的第二个参数,可以是字符串,也可以是一个生成字符串的函数(这样就能对字符串进行控制了)
其中的$0 代表的就是匹配到的字符串,他有长度,利用他的长度完成上面的操作