正则对象 | 青训营

79 阅读5分钟

正则对象

正则表达式基础

  • 正则表达式(regular expression)用来按照“给定模式匹配文本

  • 比如,正则表达式给出一个 Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。

  • 用来匹配时间,用户名格式,手机号的长度等等

  • 新建正则表达式有两种方法。

    1. 一种是使用字面量,以斜杠表示开始和结束
 /*验证字符串里面是否有xyz*/
 var regex = /xyz/; 
  1. 另一种是使用RegExp构造函数,也就是new
 var regex = new RegExp('xyz');

正则执行方法

  • 正则的执行的方法主要有两种,一种是*test()方法,另一种是exec()*方法

test()

  • 正则对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串
 /it/.test('itbaizhan') // true
  • 如果正则模式是一个字符串,则匹配所有字符串
 new RegExp('').test('abc')

exec()

正则对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null。

  var reg1 = /it/;
         var name ="itbaizhan";/* 字符串形式 */
 ​
         var result1 = reg1.test(name);
         var result2 = reg1.exec(name);
 ​
         console.log(result1);
         console.log(result2);

image-20230105003031757

0:代表正则匹配的内容

indedx:代表从哪个地址开始匹配

input:代表需匹配的原字符串

字符串方法

  • 字符串方法之中,有4种与正则表达式有关
  1. String.prototype.match() 返回一个数组,成员是所有匹配子字符串
  2. String.prototype.search() 按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置
  3. String.prototype.replace() 按照给定的正则表达式进行替换,返回替换后的字符串
  4. String.prototype.split() 按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员

String.prototype.match()

  • 字符串实例对象的match方法对字符串进行正则匹配,返回匹配结果
  • 跟exec相似
 var str = 'itbaizhan';
 var reg1 = /baizhan/;
 var reg2 = /sxt/;
 console.log(str.match(reg1));
 console.log(str.match(reg2));

image-20230112061822330

String.prototype.search()

  • 字符串对象的search方法,返回第一个满足条件的匹配结果在整个字符串中的位置
  • 如果没有任何匹配,则返回*-1*。
 "itbaizhan".search(/it/); // 0

String.prototype.replace()

  • 字符串对象的replace方法可以替换匹配的值。
  • 它接受两个参数,第一个是正则表达式,表示搜索模式,第二个是替换的内容
 "itbaizhan".replace(/it/,"sxt")

String.prototype.split()

  • 字符串对象的split方法按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组
  • 该方法接受两个参数,第一个参数是正则表达式,表示分隔规则,第二个参数是返回数组的最大成员数
 "it,sxt,itbaizhan".split(/,/)  /* ['it', 'sxt', 'itbaizhan'] */
 "it,sxt,itbaizhan".split(/,/,2)  /* ['it', 'sxt'] */  /*数组只剩下2个元素*/

匹配规则之字面量字符和元字符

字面量字符

  • 大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b。
  • 如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的a和b),那么它们就叫做“字面量字符”
 /it/.test('itbaizhan')

元字符

除了字面量字符以外,还有一部分字符有特殊含义,不代表字面的意思。它们叫做“元字符”(metacharacters),主要有以下几个

  1. 点字符(.)
  2. 位置字符
  3. 选择符(|)

点字符(.)

点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。

 /c.t/
  var reg =/s.t/
         console.log(reg.test("sxt"));/* true */
         console.log(reg.test("sxxt"));/* false */

c.t匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行,比如cat、c2t、c-t等等,但是不匹配coot

位置字符

位置字符用来提示字符所处的位置,主要有两个字符

  • ^ 表示字符串的开始位置
  • $ 表示字符串的结束位置
 /^it/.test('itbaizhan');/*开始位置*/
 /it$/.test('learn it');/*结束位置*/
 /^it$/.test('it');/*必须完全符合*/
 var reg1 = /^it/;/* 必须在开始位置 */
         console.log(reg1.test("itbaizhan"));/* true */
         console.log(reg1.test("helloitbaizhan"));/* false */
 ​
         var reg2 = /it$/;/* 必须在结束位置 */
         console.log(reg2.test("baizhanit"));/* true */
         console.log(reg2.test("helloitbaizhan"));/* false */
 ​
         var reg3 = /^it$/;/* 必须在结束位置 */
         console.log(reg3.test("it"));/* true */
         console.log(reg3.test("itbaizhanit"));/* false */

选择符(|)

竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog

 /it|sxt/.test('itbaizhan');
 /it|sxt/.test('sxtbaizhan');
  var reg4 = /cat|dog/;/* 或者 */
         console.log(reg4.test("cathello"));/* true */ 
         console.log(reg4.test("doghello"));/* true */ 

匹配规则之转义符

  • 正则表达式中那些有特殊含义的元字符,如果要匹配它们本身,就需要在它们前面要加上反斜杠
  • 比如要匹配+,就要写成+,加号在正则中又特殊意义
 /1+1/.test('1+1'); // false
 /1+1/.test('1+1'); // true

正则表达式中,需要反斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和\

温馨提示

使用new 关键字生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次

 var reg1 = new RegExp('1+1').test('1+1')
 // false
 var reg2 = new RegExp('1\+1').test('1+1')
 // true

匹配规则之字符类

  • 字符类表示有一系列字符可供选择,只要匹配其中一个就可以了。
  • 所有可供选择的字符都放在方括号
  • 比如[xyz]表示x、y、z之中任选一个匹配
 /[abc]/.test('hello world'); // false
 /[abc]/.test('apple'); // true
  • 字符类分为两类

    1. 脱字符(^)
    2. 连字符(-)

脱字符(^)

  • 如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,其他字符都可以匹配。
  • 比如,[^xyz]表示除了x、y、z之外都可以匹配
  • 也就是取反的意思
 /[^abc]/.test('sxt'); // true      完全不包含
 /[^abc]/.test('apple'); // true    不完全包含
 /[^abc]/.test('abcpple'); // true  完全包含(+其他字母)
 /[^abc]/.test('abc'); // false     完全包含(一模一样,只有abc组成)
 /[^abc]/.test('aabbcc'); // false  完全包含(只有abc组成)

温馨提示

/[^abc]/.test('aabbcc')内容必须全部都为abc才是false,否则为true

连字符(-)

  • 某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围
  • 比如, [abc]可以写成[a-c]
  • [0123456789] 可以写成 [0-9]
  • [A-Z]表示26个大写字母
  • [a-z]表示26个小写字母
 /a-z/.test('b'); // false
 /[a-z]/.test('b'); // true

以下都是合法的字符类简写形式

 [0-9.,]/*0-9 还有.和,都要匹配*/
 [0-9a-fA-F] 
 [a-zA-Z0-9-] /*a-z,A-Z,0-9,还有一个“-”*/
 [1-31]/*1,2,3*/