正则表达式RegExp类型

时间:2021-08-21 07:47:25

正则表达式RegExp类型


一、语法

  • var box = new RegExp (“参数一”); //参数一,必选*
  • var box = new RegExp (“参数一”,“标记”); //标记,可选,i:不区分大小写,g:全局模式,m:多行模式。不同的匹配,得出的验证结果不一样
  • var box = / pattern / flags; //pattern:任意简单或者复杂的正则表达式,flags:标记

二、实例属性

  • g:global,表示全局模式,添加此修饰符表示设置了全局模式;
  • i:ignorecase,设置i表示不区分大小写;
  • m:multiline,多行搜索模式;
  • source:正则表达式的字符串表示形式,以字面量形式来表示;
  • lastIndex:搜索下一个匹配项字符的起始位置,从0开始计算。

三、RegExp实例方法

  • test()方法:在字符串中查找是否与指定正则表达式相匹配,返回布尔值。匹配,返回true;不匹配,返回false。
var pattern=/ javascript / ig; //文本中是否包含 javascript
var string="this is javascript"; document.write(pattern.test(string));//文本中有javascript,正则表达式与文本匹配,返回true
  • exec()方法:在字符串中查找指定字符串。查找成功,返回包含该字符串信息的数组;查找不成功,返回null。
var pattern=/ javascript / ig;
var string="this is javascript";
document.write(pattern.exec(string)+"<br />"); //返回javascript,因为正则表达式中规定的只有/javascript/,但它返回的结果是数组
document.write(typeof pattern.exec(string)+"<br />"); //用typeof检测类型返回的是Object类型,数组属于Object类型

在返回的数组中,第一项xxx[0]:是与整个模式相匹配的字符串;第二项xxx[1]:与第一个捕获组相匹配的字符串;第三项xxx[2]:与第二个捕获组相匹配的字符串。以此类推

多次调用exec()方法时,全局状态与非全局状态的区别
  • 如果模式在一个非全局状态下,那么每一次调用exec()都会从头开始检索,始终返回第一个字符或者第一组字符.
  • 说明在非全局状态下,始终都是从头开始,发现与正则表达式相匹配的字符串就会返回结果,不会继续往下查找。
var pattern=/.at/;   
var string="cat,bat,sat,fat";
var matches=pattern.exec(string);

document.write(matches.index+"<br />"); // 0
document.write(matches[0]+"<br />"); // cat
document.write(matches+"<br />"); // cat
document.write(pattern.lastIndex+"<br />"); // 0

matches2=pattern.exec(string); //第二次调用exec()
document.write(matches2.index+"<br />"); // 0
document.write(matches2[0]+"<br />"); // cat
document.write(matches2+"<br />"); // cat
document.write(pattern.lastIndex+"<br />"); // 0
  • 如果模式在一个全局状态下,每一次调用exec()会在当前字符串中继续查找新匹配项,遍历整个字符串。
var pattern=/.at/g;
var string="cat,bat,sat,fat";
var matches=pattern.exec(string);

document.write(matches.index+"<br />"); // 0 ,匹配项的第一个字符在文本中的位置
document.write(matches[0]+"<br />"); // cat , 符合正则表达式返回的数组第一项
document.write(matches+"<br />"); // cat , 符合正则表达式返回的数组
document.write(pattern.lastIndex+"<br />"); // 3 ,搜索下一个匹配项字符的起始位置,从0开始计算

matches2=pattern.exec(string); // 第二次调用exec()
document.write(matches2.index+"<br />"); // 4 ,匹配项的第一个字符在文本中的位置
document.write(matches2[0]+"<br />"); // bat
document.write(matches2+"<br />"); // bat
document.write(pattern.lastIndex+"<br />"); // 8 ,搜索下一个匹配项字符的起始位置,从0开始计算

四、元字符

  • 正则表达式由两种字符组成:
  • 原义文本字符:字符串类型
  • 元字符
  • 元字符时在正则表达式中有特殊含义的非字母字符
量词
字符 含义
. 任意字符
* 出现0次、1次或者多次
+ 出现1次或者多次
出现0次或者1次
{n} 出现n次
{n,m} 出现n至m次
范围类
字符 含义
[a-z] 从a-z的任意字符,也包含a,z本身
[A-Z] 从A-Z的任意字符,也包含A,Z本身
[0-9] 从0-9的任意数字,也包含0,9本身
[a-zA-Z0-9] 从a-zA-Z0-9的任意字符
预定义类
字符 含义
\d 数字字符
\D 非数字字符
\s 空白符
\S 非空白符
\w 单词字符(字母、数字、下划线)
\W 非空白符
匹配边界的字符
字符 含义
^ 此符号在中括号内表示“非XXX”,如果在中括号外则表示开头
$ 表示结束、结尾
\b 表示字符边界
\B 表示非字符边界
分组
  • 使用“()”可以达到分组的功能,使量词作用于分组,而不是紧挨着它的字符
    • 表达式:/abc{3}/ 返回的结果为:abcccc,只是紧挨着量词的字符c被应用
    • 表达式:/(abc){3}/返回的结果为:abcabcabc,整个字符串都被应用
  • 使用“ | ”表示“或”
"ByronsperByrcasper".replace(/Btr(on|ca)sper/g,"x");
//返回的结果为:xx,表示字符串中含有on或者ca的都被替换成x
贪婪模式:尽可能多的匹配
var pattern=/\d{3,6}/;
var string="123456789";
document.write(string.replace(pattern,"X"));
//返回的结果为:X789,
//根据正则表达式的定义,匹配字符串中3至6个字符,贪婪模式选择取最大值更多的匹配,1-6都被替换
非贪婪模式:尽可能少的匹配,也就是说,一组字符串中,前面有匹配成功的,那么久不回再向后搜索匹配项。
  • 在量词后加上“ ? ”表示非贪婪模式
var pattern=/\d{3,6}?/;
var string="123456789";
document.write(string.replace(pattern,"X"));
//返回结果:X456789,
//只匹配到最小值,当3匹配成功后,就不会再往后搜索匹配项,所以到3为止
RegExp.$1………9 用于存储捕获组的构造函数属性
var string="this is 'javascript'";
var pattern=/'(.*)'/;
document.write(string.replace(pattern,"<strong>$1</strong>"));
//()圆括号内的捕获组就是$1,此返回结果将‘javascript’加粗
//不管如何修改捕获组里的内容,结果都会跟随修改而改变,不需要单独再修改
  • 使用捕获组反向引用
var string="2017-07-23";
var pattern=/(\d{4})-(\d{2})-(\d{2})/;
document.write(string.replace(pattern,"$3/$2/$1"));
//返回结果:23/07/2017
//在正则表达式中“(\d{4})”表示$1,“(\d{2})”表示$2,“(\d{2})”表示$3
  • 忽略捕获组
    • 不希望捕获某些分组,只需要在分组内加上“ ?: ”
var string="2017-07-23";
var pattern=/(\d{4})-(\d{2})-(?:\d{2})/;
document.write(string.replace(pattern,"$3/$2/$1"));
//返回的结果为 $3/07/2017
//忽略了捕获组$3