资讯专栏INFORMATION COLUMN

javascript正则表达式RegExp再次研究-replace

hzc / 1305人阅读

摘要:嵌套分组的捕获如果碰到类似我就是陌上寒的嵌套分组,捕获的顺序是什么来试试我就是陌上寒我就是陌上寒我就是陌上寒我是陌上寒陌上寒规则是以左括号出现的顺序进行捕获。

原文链接

昨天说了几个RegExp的几个实例属性

global 标示正则表达式是否指定了全局模式g(只读)

ignoreCase 标示正则表达式是否指定了不区分大小写模式i(只读)

mutiline 标示正则表达式是否指定了多行模式m(只读)

lastIndex 如果使用了全局模式,这个变量保存的是在字符串中尝试下次的匹配的偏移值,在test()和exec()中会用到这个值(可写)

source 返回创建RegExp对象实例时指定的表达式文本字符串。(只读)

虽然有那么多属性,但是基本用不到,为什么呢?因为这些信息都包含在模式声明中了:
字面量创建的正则

var reg = /[abc]de/i
console.log(reg.global);//=>false
console.log(reg.ignoreCase);//=>true
console.log(reg.multiline);//=>false
console.log(reg.lastIndex);//=>0
console.log(reg.source);//=>[abc]de

通过RegExp构造函数创建的也是一样的结果

  var reg2 = new RegExp("[bc]at","i")
  console.log(reg2.global);//=>false
  console.log(reg2.ignoreCase);//=>true
  console.log(reg2.multiline);//=>false
  console.log(reg2.lastIndex);//=>0
  console.log(reg2.source);//=>[abc]de
replace

说到正则表达式,不得不提replace
stringObject.replace(regexp/substr,replacement)

参数1:可以是字符串,也可以是正则表达式

参数2:可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。

返回一个新的字符串,是用 参数2 替换了 参数1 的第一次匹配或所有匹配之后得到的。

$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。

$& 与 regexp 相匹配的子串。

$` 位于匹配子串左侧的文本。

$" 位于匹配子串右侧的文本。

$$ 直接量符号。

replace例一:匹配一次,区分大小写

    var aStr = "Hello 陌上寒!"
    var bStr = aStr.replace("陌上寒", "正则表达式")
    console.log( bStr)//=>Hello 正则表达式!

replace例二:全局匹配

    var cStr =`你好 陌上寒! 我是陌上寒,我们一起来交流讨论前端,每天更新,欢迎关注`
    var dStr = cStr.replace(/陌上寒/g, "moshanghan")
    console.log(dStr)//=>你好 moshanghan! 
     //=>我是moshanghan,我们一起来交流讨论前端,每天更新,欢迎关注

replace例三:忽略大小写,匹配一次

var cStr ="我是 Moshanghan! moshanghan是我"
var dStr = cStr.replace(/moshanghan/i, "陌上寒")
console.log(dStr)//=>我是 陌上寒! moshanghan是我

replace例四:忽略大小写,全局匹配

var cStr ="我是 Moshanghan! moshanghan是我"
var dStr = cStr.replace(/moshanghan/ig, "陌上寒")
console.log(dStr)//=>我是 陌上寒! 陌上寒是我

加点难度
replace例五:hello, moshanghan转换为moshanghan hello
以下的输出是相同的

var name = "hello, moshanghan";
var a = name.replace(/(w+)s*,s*(w+)/, "$2 $1");
console.log(a);//=>moshanghan hello
var b = name.replace(/(w+)s*, (w+)s*/, "$2 $1");
console.log(b);//=>moshanghan hello
var c = name.replace(/(w+), (w+)/, "$2 $1");
console.log(c);//=>moshanghan hello
var d = name.replace(/(w*), (w*)/, "$2 $1");
console.log(d);//=>moshanghan hello

replace例六:

var name = `"a", "b"," dd"`;
var aa = name.replace(/"([^"]*)"/, ""$1"");
console.log(aa); //=>"a", "b"," dd"
console.log(/"([^"]*)"/g.test(name)); 

replace例七:

var name = "aaa bbb ccc";
var uw = name.replace(/w+/g, function (word) {
    return word.substring(0, 1).toUpperCase() + word.substring(1);
});
console.log(uw); //Aaa Bbb Ccc

要理解上面的,有几个关于正则的概念需要知道

分组

下面的正则表达式可以匹配kidkidkid:

var b =/kidkidkid/
console.log(b.test("kidkidkid")); //=>true

而另一种更优雅的写法是:

var b =/(kid){3}/
console.log(b.test("kidkidkid")); //=>true

这里由圆括号包裹的一个小整体称为分组。

候选

一个分组中,可以有多个候选表达式,用|分隔:

 var reg = /I love (him|her|it)/;
console.log(reg.test("I love him"));//=>true
console.log(reg.test("I love her"));//=>true
console.log(reg.test("I love it"));//=>true
console.log(reg.test("I love them"));//=>false
捕获与引用

被正则表达式匹配(捕获)到的字符串会被暂存起来。其中,由分组捕获的串会从1开始编号,于是我们可以引用这些串

var reg = /(d{4})-(d{2})-(d{2})/
var date = "2010-04-12"
reg.test(date)
console.log(RegExp.$1);//=>2010
console.log(RegExp.$2);//=>04
console.log(RegExp.$3);//=>12

$1引用了第一个被捕获的串,$2是第二个,依次类推。

嵌套分组的捕获

如果碰到类似/((我) 就 (是 (陌上寒)))/的嵌套分组,捕获的顺序是什么?来试试:

var reg = /((我) 就 (是 (陌上寒)))/
var str = "我 就 是 陌上寒"
reg.test( str ) // true
console.log(RegExp.$1);//=>我 就 是 陌上寒
console.log(RegExp.$2);//=>我
console.log(RegExp.$3);//=>是 陌上寒
console.log(RegExp.$4);//=>陌上寒

规则是以左括号“(”出现的顺序进行捕获

昨日回顾
从今天起开启对正则表达式的学习
参考链接
JavaScript正则表达式的分组匹配详解
JavaScript replace() 方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99478.html

相关文章

  • 浅尝正则达式

    摘要:同样的你也可以测试第四次执行的时候就会是了,需要知道的是,只有在全局检索时才会生效,否则的话只会返回哦方法二使用正则表达式模式对字符串执行搜索,并将更新全局对象的属性以反映匹配结果。 之前写正则都是各种上网搜索,还是没有系统的学习过正则表达式的用法,今天稍稍研究了一下下,感觉还是收获颇丰的,分享给各位,希望对于你们有所帮助~~ 修饰符 g --全局匹配 i --不区分大小写,默认...

    HelKyle 评论0 收藏0
  • JS中正则达式研究(一)

    摘要:因为做一道题,题目如下其中一个解答,引起了我对正则的研究兴趣,解答如下我对正则表达式中的正向肯定预查一直不带明白,所以趁这个机会研究一下。与此同时,对象的更新为下一次开始匹配的索引值。 因为做一道题(http://www.codewars.com/kata/insert-dashes/solutions/javascript),题目如下: Write a function insert...

    zhouzhou 评论0 收藏0
  • JavaScript 编程精解 中文第三版 九、正则达式

    摘要:使用构造器时,需要将模式书写成普通的字符串,因此反斜杠的使用规则与往常相同。构造器的后四个参数小时分钟秒毫秒是可选的,如果用户没有指定这些参数,则参数的值默认为。 来源:ApacheCN『JavaScript 编程精解 中文第三版』翻译项目原文:Regular Expressions 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript...

    Pluser 评论0 收藏0
  • JavaScript正则达式

    摘要:正则表达式是由普通字符例如字符到以及特殊字符称为元字符组成的文字模式。方法参数一个正则表达式对象。如果正则表达式没有标志,则会返回和相同的结果。其被视为一整个字符串,而不是一个正则表达式。 正则表达式 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为元字符)。正则表达式使用单个字符串来描述、匹配一系列匹配某个...

    jsdt 评论0 收藏0
  • 正则达式前端使用手册

    摘要:非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 导读 你有没有在搜索文本的时候绞尽脑汁, 试了一个又一个表达式, 还是不行. 你有没有在表单验证的时候, 只是做做样子(只要不为空就好), 然后烧香拜佛, 虔诚祈祷, 千万不要出错. 你有没有在使用sed 和 grep 命令的时候, 感觉莫名其妙, 明明应该支持的元字符, 却就是匹配不到. 甚至,...

    zhoutao 评论0 收藏0

发表评论

0条评论

hzc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<