正则表达式 --- js

正则表达式 都是 操作字符串的          说白了,找到符合规则的字符串

正则表达式 是由普通字符(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 代表的就是匹配到的字符串,他有长度,利用他的长度完成上面的操作


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值