博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式周二挑战赛 - 第八周
阅读量:6264 次
发布时间:2019-06-22

本文共 1263 字,大约阅读时间需要 4 分钟。

,每周二会出一道正则表达式的题目,比较简单,如果你答出来了,可以留言,如果答不出来.可以看看我的答案和解释.下面内嵌了原题目页面.你要做的就是使用JavaScript正则字面量的写法/regex/i,来通过所有的测试用例.本周题目的具体要求是把用例文本中第二次出现的相同行按规则在左右两侧各添加两个星号,一共有两个文本框需要填写,左边的写替换正则,右边的写替换结果.相当于使用"xxoo".replace(/xx/,"oo").

 

查看答案

这个题目主要考察捕获分组.

1.匹配左边的文本

首先应该写出匹配左边文本第一行的正则,由于用到了$锚点,所以得使用多行模式m:

/^. .+$/m

从第二行中开始有重复行,所以必须用到捕获分组和反向引用.

/^(. .+)$\n\1/m

2.开始替换

最先尝试:

/^(. .+)$\n\1/m    替换为     $1\n$1       //匹配情况3/10

发现\n并不能显示为换行符,于是需要捕获前面的换行符:

/^(. .+)$(\n)\1/m    替换为     $1$2$1       //匹配情况3/10

在适当的地方加上星号:

/^(. .+)$(\n)\1/m    替换为     $1$2* *$1**       //匹配情况3/10

发现左边的两个星号后面多了个空格.需要再细化一下$1,添加一个捕获分组:

/^(. (.+))$(\n)\1/m  替换为     $1$3* **$2**       //匹配情况6/10

第五个用例没有通过,是因为它需要两次替换,于是加上g选项:

/^(. (.+))$(\n)\1/mg  替换为     $1$3* **$2**       //匹配情况7/10

第八个用例错误的多匹配了一个,需要给匹配正则的第二行加上$锚点:

/^(. (.+))$(\n)\1$/mg  替换为     $1$3* **$2**       //匹配情况8/10

第九个用例没有匹配,是因为左侧的第二行文本开始处有两个空格,这次我们需要大改正则,把不定长的空格也放到一个捕获分组中并替换到右侧:

/^(. (.+))$(\n)\S+(\s+)\2$/mg  替换为     $1$3*$4**$2**       //匹配情况9/10

第十个用例没有匹配,是因为忽略大小写的问题,于是加上i选项:

/^(. (.+))$(\n)\S+(\s+)\2$/mgi  替换为     $1$3*$4**$2**      //匹配情况9/10
居然还是不成功,仔细一看,原来是匹配的结果必须是第二行中的原始数据(大写),而不是第一行的数据.于是我们还需要将反向引用\2放到一个捕获分组中:
/^(. (.+))$(\n)\S+(\s+)(\2)$/mgi  替换为     $1$3*$4**$5**      //匹配情况10/10
再看看有没有多余的捕获分组,有的话需要去掉或者替换成非捕获分组.1到5都有用,那就不用去了.

转载地址:http://pwzpa.baihongyu.com/

你可能感兴趣的文章
STL模板整理 pair
查看>>
【转】jmeter学习笔记——一个简单的性能测试
查看>>
企业级镜像管理系统Harbor
查看>>
A Plain English Guide to JavaScript Prototypes
查看>>
学习总结汇总
查看>>
Beta阶段测试报告
查看>>
JQ 练习题
查看>>
AndroidStudio、gradle、buildToolsVersion关系
查看>>
WPF入门教程系列八——布局之Grid与UniformGrid(三)
查看>>
递归调用顺序问题
查看>>
Git学习笔记一《版本控制之道-使用Git》
查看>>
Java8新特性--日期和时间API
查看>>
python itertools
查看>>
Eclipse自动补全+常用快捷键
查看>>
Dubbo 浅读
查看>>
payload有效载荷(转)
查看>>
利用谷歌控制台console调用后台代码
查看>>
jquery 点击按钮实现listbox的显示与隐藏,点击其他地方按钮外的地方,隐藏listbox...
查看>>
CSS3 盒阴影(box-shadow)详解
查看>>
PHP基础之 file_get_contents() 函数
查看>>