正则表达式

一、正则表达式

创建正则表达式对象

JavaScript中使用RegExp对象来封装一个正则表达式,并提供相关的方法和属性。
创建方法:

字面量:
let reg = /\bis\b/g; //g表示全文匹配
let str = "He is a boy. This is a dog. Where is she?";
console.log(str.replace(reg, "IS"));//is替换为IS

构造函数:
let reg = new RegExp("\\bis\\b", "g");
let str = "He is a boy. This is a dog. Where is she?";
console.log(str.replace(reg, "IS"));

修饰符

g:global,全文搜索,若不添加免责搜索到第一个匹配即停止。
i:ignore case,忽略大小写,正则表达式是大小写敏感的。

let str = "He is a boy. Is he?";
console.log(str.replace(/\bis\b/gi, "0"));

m:multiple lines,多行搜索,搜索时识别换行符。

元字符

正则表达式由两种基本字符类型组成:

原义文本字符:如:a,abc等
元字符:在正则表达式中有特殊的非字母字符。如:\b用于匹配单词边界。
一些特殊的符号:如: + ? $ ^ . | \ ( ) { } [ ]

字符类

一般情况下,正则表达式一个字符对应字符串的一个字符。
例如:表达式 ab\t 的含义是 "ab"紧接着一个 tab(制表符)
当需要匹配一类字符时,可以使用[ ]来构造一个简单的类。
所谓类,是指符合某些特性的对象,一个泛指,而不是特指某个字符。
例如:表达式[abc]把字符 a、b、c 归位一类,表达式可以匹配这类字符,即匹配其中之一。

let str = "a1b2c3d4";
console.log(str.replace(/[abc]/g, "x"));
//x1x2x3d4

字符类取反:使用元字符^创建反向类,即匹配不属于该类的字符。
例如:[^abc]表示不是字符 a、b、c 其中之一的字符

let str = "a1b2c3d4";
console.log(str.replace(/[^abc]/g, "x"));
//axbxcxxx

范围类

需要匹配数字时,可以使用。
例如:[a-z]表示从 a 到 z 之间的任意字符,且包含 a 和 z 本身。

let str = "a1b2c3d4z0";
console.log(str.replace(/[a-z]/g, "X"));

在[ ]中可以将一些范围连续书写。

let str = "a1b2c3d4A5B6C7D8";
console.log(str.replace(/[a-zA-Z0-9]/g, "*"));//包括小写的a-z,大写的A-Z,数字0-9
str = "2020-03-04";
console.log(str.replace(/[0-9-]/g, "0"));//包括数字0-9,和' - '

预定义类

正则表达式还提供了一些预定义类,用于快捷的表示一些特定的范围。
.(点),[^\r\n],除了回车符和换行符之外的所有字符。
\d,[0-9],数字字符
\D,[^0-9],非数字字符
\s,[\t\n\x0B\f\r],空白符,\f 换页符,\r 回车符,\t 水平制表符,\n 换行符,\x0b 垂直制表符
\S,[^\t\n\x0b\f\r],非空白符
\w,[a-zA-Z_0-9],单词字符(包括字母、数字和下划线)
\W,[^a-za-z_0-9],非单词字符(除字母、数字和下划线之外的字符)

边界

匹配简介字符

^,以 xxx 开始
$,以 xxx 结束
\b,单词边界
\B,非单词边界

let str = "This is a boy";
console.log(str.replace(/is/g, "0"));//Th0 0 a boy
console.log(str.replace(/\bis\b/g, "0"));//This 0 a boy
console.log(str.replace(/\Bis\b/g, "0"));//Th0 is a boy
str = "@123@abc@";
console.log(str.replace(/@./g, "Q"));//Q23Qbc@
console.log(str.replace(/^@./g, "Q"));//Q23@abc@
console.log(str.replace(/.@/g, "Q"));//@12QabQ
console.log(str.replace(/.@$/g, "Q"));//@123@abQ
str = `@123
@456
@789`;
console.log(str.replace(/^@\d/g, "X"));//X23
//@456
//@789
console.log(str.replace(/^@\d/gm, "X"));//X23
//X56
//X89

量词

匹配字符连续出现n次的字符串

?,出现 0 次或 1 次
+,出现 1 次或多次
*,出现 0 次或多次
{n},出现 n 次
{n, m},出现 n 到 m 次
{n,},出现 n 次或更多次

贪婪模式和非贪婪模式

贪婪模式:例如:\d{3,6}匹配"12345678"的结果是什么?默认情况下,正则表达式会尽可能多的匹配,即采用 6 次来匹配。

console.log("12345678".replace(/\d{3,6}/g, "x"));
//x78

非贪婪模式:与贪婪模式相反,即尽可能少的匹配,一旦成功匹配就不再继续尝试其他的可能性。在模式后面加上?

console.log("12345678".replace(/\d{3,6}?/g, "x"));
//xx78

分组

例如: Byron{3}表示对 n 匹配 3 次,而不是 Byron。如果要对 Byron 匹配三次,就需要对其进行分组。

console.log("a1b2c3d4".replace(/[a-z]\d{3}/g, "X"));
console.log("a1b2c3d4".replace(/([a-z]\d){3}/g, "X"));

使用 | 表示或,表示|左右字符二选一。
例如: 比较 Byron|Casper 和 Byr(on|Ca)sper。

console.log("ByronCasper".replace(/Byron|Casper/g, "X"));
console.log("ByrCasperByronsper" 
.replace(/Byr(on|Ca)sper/g, "X"));

反向引用

使用$n的形式引用模式中分组匹配到的文本,n为索引,从1开始。
例如:把 2020-03-04 替换成 03/04/2020。

console.log("2020-03-04" 
.replace(/(\d{4})-(\d{2})-(\d{2})/g, "$2/$3/$1"));

当不想捕获分组时,可以使用?:。
例如:(?:Byron).(ok)就会忽略对第一个分组的捕获。

console.log("2020-03-04" 
.replace(/(\d{4})-(\d{2})-(?:\d{2})/g, "$2/$3/$1"));

前瞻

正则表达式从文本头部向尾部开始解析,文本尾部方向,称为"前"。在正则表达式匹配到规则的时候,向前检查是否符合断言。符合和不符合特定断言称为"肯定/正向"和"否定/负向"匹配。
正向前瞻:exp(?=assert)
负向前瞻:exp(?!=assert)
exp和assert都是正则表达式,匹配到exp时还要判断assert是否符合,如果符合才会被匹配。
例如:表达式\w(?=\d),表示匹配到一个单词\w 时还需要向后判断是否为一个数字\d。

console.log("a2*34V8".replace(/\w(?=\d)/g, "X"));//X2*X4X8
console.log("a2*34V8".replace(/\w(?!\d)/g, "X"));//aX*3XVX

二、JavaScript中的正则表达式

RegExp对象属性

global,是否全文搜索,默认false。
ignoreCase,是否忽略大小写,默认false。
multiline,是否多行搜索,默认false。
lastIndex,当前表达式匹配内容的最后一个字符的下一个位置。
source,正则表达式的文本字符串。
global、ignoreCase、multiline三个属性都是只读的。

let reg1 = /\w/;
let reg2 = /\w/gim;
console.log(reg1.global);//false
console.log(reg1.ignoreCase);//false
console.log(reg1.multiline);//false
console.log(reg2.global);//true
console.log(reg2.ignoreCase);//true
console.log(reg2.multiline);//true
//以上三个属性都是只读的。
console.log(reg2.source);//\w

RegExp对象方法
test(str),用于测试字符串参数中是否存在匹配正则表达式模式的字符串,返回true或false。
exec(str),使用正则表达式模式对字符串执行搜索,并将更新全部RegExp对象的属性以反映匹配结果。
如果没有匹配的文本则返回 null,否则会返回一个结果“数组”对象。
[匹配到的文本, 与第 1 个分组相匹配的文本,与第 n 个分组相匹配的文本…]
index,声明匹配文本的第一个字符的位置
input,存放被检索的字符串 string

let reg1 = /\w{1,2}/g;
  console.log(reg1.test("ab,cd"));//true
  console.log(reg1.exec("ab,cd"));
  	//["cd", index: 3, input: "ab,cd", groups: undefined]
	//0: "cd"     最近一个匹配到的字符串
	//groups: undefined
	//index: 3   在输入的字符串中匹配到的以0开始的索引值。
	//input: "ab,cd"   初始字符串。
	//length: 1
	//__proto__: Array(0)
   console.log(reg1.source);//\w{1,2}

字符串与正则表达式相关的方法

search(reg),用于检索字符串指定的子字符串,或检索与正则表达式匹配的子字符串。返回第一个匹配结果的index,没有匹配到返回-1。不执行全局匹配。
match(reg),检索字符串以找到一个或多个与regexp匹配的文本,未找到返回null,找到后返回一个数组。与RegExp的exec()方法相同。
matchAll,一个在字符串中测试匹配的String方法,返回一个迭代器(iterator)。
split(reg),利用regexp匹配结果作为分隔符对字符串进行分割,返回一个数组。
replace(reg,newStr),将regexp的匹配结果替换成newStr,返回一个新字符串。

let str = "<java> and <javascript> is deferent!";
  console.log(str.match(/<\S*>/g));
  //["<java>", "<javascript>"]
  console.log(str.replace(/<(\S*)>/g, "<<$1>>"));
  //<<java>> and <<javascript>> is deferent!
  console.log(str.split(/[<>]/g));
  //["", "java", " and ", "javascript", " is deferent!"]

replace(reg,function)用法

let s1 = "a1b23d4e5".replace(/\d/g,
//match:匹配的字串(对应$&);
 function(match, index, origin) {
  console.log(index);
  return parseInt(match) + 1;
});
//1
//3
//4
//6
//8
let s2 = "a1b23d4e5".replace(/(\d)(\w)(\d)/g, 
//group1, group2, group3:代表第n个括号匹配的字符串(和$1,$2相同)。
function(match, group1, group2, group3, index, origin) {
  console.log(match);
  return group1 + group3;
});
//1b2
//3d4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值