正则表达式基础

创建正则表达式对象

两种创建方法

  1. 字面量
{
    var reg=/\bis\b/g;//g表示全局匹配
    var str="He is a body. This is a dog.Where is she?";
    console.log(str.replace(reg,"IS"));
}
  1. 构造函数
{
    var reg=new RegExp("\\bis\\b","g");//g表示全局匹配
    var str="He is a body. This is a dog.Where is she?";
    console.log(str.replace(reg,"IS"));
}
  • 修饰符
    • g:全文搜索,不添加则只会搜索第一个
    • i: 匹配时忽略大小写
    • m:多行搜索
    • u:处理大于\uFFF的Unicode字符
    var str="He is a boy,Is he?"
    console.log(str.replace(/\bis\b/gi,"0"));
/^\uD83d/u.test('\uD83D\uDC2A')  //false
/^\uD83d/.test('\uD83D\uDC2A')  //true

字符类

  • 一般情况正则表达式的一个字符对于字符串的一个字符
{
    var str="a1b2c3d4";
    console.log(str.replace(/[abc]/g,"x"));
}
  • 字符类取反
    • 使用^创建方向类
let str = "abcd123"
console.log(str.replace(/[^abc]/g,"x"));

范围类

  • 用于匹配数字时
{
    var str="a1b2c3d4";
    console.log(str.replace(/[a-z]/g,"x"));
}
  • 在[ ] 中科院将一些范围连续书写
{
    var str="a1b2c3d4B5C6Z7j8k9l0";
    console.log(str.replace(/[a-zA-Z0-9]/g,"x"));
    var str="2020-03-04"
    console.log(str.replace(/[0-9-]/g,"*"));
}

边界

  • ^以xxx开始
  • $以xxx结束
  • \b单词边界
  • \B非单词边界
{
    var str ="This is a body";
    console.log(str.replace(/\Bis\b/g,"0"));
    var str="@123@abc@";
    console.log(str.replace(/@./g,"X"));
    console.log(str.replace(/^@./g,"Q"));
    console.log(str.replace(/.@/g,"M"));
    console.log(str.replace(/.@$/g,"Q"));
    console.log("\n");
    str=`@123
@456
@789`;
    console.log(str.replace(/^@\d/g,"Q"));
    console.log(str.replace(/@\d/gm,"M"));
}

贪婪模式

  • 尽可能多的匹配
{
    console.log("12345678".replace(/\d{3,6}/g,"x"));

非贪婪模式

· 尽可能少的匹配

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

分组

  • 例如:Byen{3}表示对n匹配3次。
console.log("a1b2c3d4".replace(/[a-z]\d{3}/g,"x"));
console.log("a1b2c3d4".replace(/([a-z]\d){3}/g,"x"));

  • 使用 | 表示左右字符二选一
console.log("ByronCasper".replace(/Byron|Casper/g,"x"));        //xx

console.log("ByronCasperByronCasper".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})/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"));
console.log("a2*34V8".replace(/\w(?!\d)/g, "X"));

RegExp对象属性

  • global,是否全文搜索,默认 false。
  • ignoreCase,是否忽略大小写,默认 false。
  • multiline,是否多行搜索,默认 false。
  • lastIndex,当前表达式匹配内容的最后一个字符的下一个位置。
  • source,正则表达式的文本字符串。
let reg1 = /\w/;
let reg2 = /\w/gim;
console.log(reg1.global);
console.log(reg1.ignoreCase);
console.log(reg1.multiline);
console.log(reg2.global);
console.log(reg2.ignoreCase);
console.log(reg2.multiline);
//以上三个属性都是只读的。
console.log(reg2.source);

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"));
  console.log(reg1.exec("ab,cd"));   console.log(reg1.source);

字符串正则方法

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

    • search(reg),用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。返回第一个匹配结果的 index,没有匹配到返回-1。不执行全局匹配。
    • match(reg),检索字符串以找到一个或多个与 regexp 匹配的文本,未找到返回 null,找到后返回一个数组。与 RegExp 的 exec()方法相同。
    • split(reg),利用 regexp 匹配结果作为分隔符对字符串进行分割,返回一个数组。
    • replace(reg, newStr),将 regexp 的匹配结果替换成 newStr,返回一个新字符串。
let str = "<java> and <javascript> is deferent!";
console.log(str.match(/<\S*>/g));
console.log(str.replace(/<(\S*)>/g, "<<$1>>"));
console.log(str.split(/[<>]/g));

字符串正则方法

  • replace(reg, function)的用法
let s1 = "a1b23d4e5".replace(/\d/g, function(match, index, origin) {
  console.log(index);
  return parseInt(match) + 1;
});

let s2 = "a1b23d4e5".replace(/(\d)(\w)(\d)/g, 
function(match, group1, group2, group3, index, origin) {
  console.log(match);
  return group1 + group3;
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值