正则表达式游戏的答案

两天过去了,我们才送出了四个番茄钟(其中一个还是作为礼物送给了鲁鸿驹先生,感谢鲁鸿驹的现场莅临指导 ,鲁总是VIM的fans,多年不编程的他还记得是删除一行的指令是 dd )。

有一位F4的兄弟,我们忘记记录你的姓名了,请你接受我们的致敬!你回办公室Notepad++上验证好了正则表达式,然后来现场,因为VSCode的Regexp的语法同Notepad++存在的些许差异,差一点点就通过了,即便如此,我们仍然送出了一个番茄钟,希望你能进一步利用好番茄钟和番茄工作法,进一步提高办公效率。

题目没有要求来编程实现,而是要求在编辑器中完成,并且没有限制用什么编辑器。在这里,我们主要使用 Visual Studio Code。为什么主要是 VSCode,往下看就知道了。

游戏一(难度系数):

一个文本文件中有不少电话号码,它们的格式是用 1 开始的连续11位数字。比如:13923781654。现在为了规范,需要将他们转换为 139-2378-1654 这样3-4-4的分段格式,中间用短横线分隔。请你在一个编辑器中使用Replace功能,一步完成所有的转换。

解答:

在 VS Code 中用 Ctrl + H 调出 Replace ;

在 Search 框中输入 \b(1\d)(\d)(\d)\b 。说明,这里前后加入的 \b是限定符,匹配字的边界(开头或者结尾);如果不用 \b,那么可能连续14或者15个不是有效的电话号码都会被匹配替换。

在 Replace With 框中输入 $1-$2-$3

注意打开“使用正则表达式”的选项开关(快捷键 Alt + R);

然后选择 Replace All,如图:

游戏二(难度系数):

我们写代码的时候,一不小心会在代码行后面留下一些多余的空格、Tab等。现在请你针对一个源文件,一次性的将所有代码行末尾多余的空格/Tab 字符全部删除掉;也就是说,每一行的回车换行符前面不能是空字符。

解答:

在 Search 框中输入 \s+$ 。说明:\s表示空字符(空格或者tab),\s+表示一个或者多个连续的空格,$表示行尾;

Replace 框中保持为空

点击 Replace All

游戏三(难度系数):

我们写代码的时候,往往会不经意之间留下一些连续的空行。空行,就是只有回车换行、空格、Tab的行。我们把连续两个或两个以上的空行,叫做连续空行。连续空行不美观、占用屏幕空间,现在请你在编辑器中,一步将所有的连续空行换成单独一个空行。

解答:

Search 框中输入 ^(\s*\n)。说明:^表示行首,\s*\n表示0个或者多个连续空字符然后跟着一个换行符,表示至少两个的重复;

Replace 框中输入 \n

点击 Replace All

游戏四(难度系数):

把代码中所有的十六进制数字(以 0x或者0X 开始的数字),转换成大写字母。例如把 0xab12ff00,转换成 0XAB12FF00。

解答:

编辑器 Visual Studio Code 对此无能为力了(一般的编辑器也都是奈何不了的),必须祭出大杀器VIM,步骤如下:

用Vim 打开这个文件

按几下 ESC ,进入命令模式

输入如下命令 :%s/\/\U&/gi

回车,所有的十六进制就变成大写了

稍微解释一下:VIM 的 regex 语法和VSCode的不太一样,功能也强大很多,%s 表示对所有的行进行查找替换,%s/xxx/yyy/g ,意思就是把所有行中的 xxx 都替换成 yyy,这里是替换成 \U& ,意思就是把匹配到的所有目标串变成大写。如果 \L& ,那就是换成小写。命令最后的 g 表示全部替换, i 表示查找的时候不区分大小写,这样 0x 和 0X 开始、或者原来就存在大写字母的的十六进制数字都会被找出来并且替换掉。

这里替换模式用 \< 和 \> 包围起来了,这和 VSCode 里面的 \b 是类似效果,避免错误的匹配和替换;

如果需要每次替换前都确认下,那么在最后加上c,写成 gic,这样VIM每次替换前都会要求你确认是否替换;

如下图,看起来是不是很炫酷?

游戏五(难度系数)

测试脚本用 Ruby 写成,里面定义了一系列的函数,ruby 的函数定义格式如下

def foo()

# ...

end

这个文件的 ruby函数定义都在单独一行,def 左边只能有空格或者顶头开始,def和函数名之间有一个或者多个空格。现在要求给本文件的所有函数改名,在原名字的前面加上模块名 AAA,例如将 foo 修改成 AAA_foo。

解答:

还是回到 Visual Studio Code,打开 Replace 对话框,操作步骤如下:

Search 中输入 ^(\s*def\s+)([_a-z0-9]+)

Replace With 中输入 $1AAA_$2

选择 Replace All;

使用正则表达式进行编辑(查找、替换)一个常用技巧,就是通过特定的子串来缩小替换范围,比如上面的例子中,^(\s*def\s+) 这个子串,它表示顶行开始 def 关键字,其实并不是我们想要进行替换操作的对象,但是我们仍然要把它放在这里,目的就是通过它筛选出所有的函数名,只有跟在这个特定的def之后的名字,才是我们要替换的函数名。

正则表达式是非常强大的、有趣的东西。套用一句广告语:谁用谁知道啊!从上面的几个例子也可以看到,不同的编辑器,其所采用的正则表达式的语法也是存在差异的,比如VSCode里面表示1个或者多个重复,用 +,但是在vim里面,必须用 \+,为了高效使用正则表达式,选定一个固定的好编辑器并且用熟练,是很有必要的。否则我们的时间就会浪费在查找 regexp 的语法细节上。

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏三丰SanFeng

Linux和Windows的换行符

一直对换行符这个东西概念比较模糊,直到最近花了一点时间仔细研究了一下,才彻底搞清楚这个问题,本文前面介绍部分是外文转载,后面例子是个人总结,希望能对大家有一些帮...

2847
来自专栏CDA数据分析师

20个小招数教你如果快速完成Python 性能优化升级

使用python时,你是不是需要性能优化?今天C君给大家带来python性能优化的20条招数,建议收藏~

1192
来自专栏PPV课数据科学社区

工具 | 如何在Python中调用R语言包?

R语言是非常强大的做统计分析和建模方面的开源软件,它有非常丰富的统计软件包,做统计可以说只有你想不到的,没有R办不到的。Python又是当下最流行的编程软件之一...

1.1K8
来自专栏wOw的Android小站

[设计模式]之六:桥接模式

这个原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封禁,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大...

890
来自专栏一个爱吃西瓜的程序员

利用requests和正则表达式抓取猫眼电影top100

刚学了正则表达式,赶紧用它来练练手,以防搞忘了。这次练习的目标比较简单,就是爬取猫眼电影top100,具体包括电影排名,片名,主演,上映时间,评分等信息。最后存...

942
来自专栏机器学习算法与Python学习

Python再次更新! 解锁与优化多项新特性......

Python 3.7.0 版本于 6 月 27 号正式发布,该版本有多项重大的更新和改进,主要内容如下如下:

1090
来自专栏AI研习社

Python 3.7.0 发布,包含多项新特性和优化

Python 3.7.0 版本于 6 月 27 号正式发布,该版本有多项重大的更新和改进,主要内容如下如下:

901
来自专栏王磊的博客

如何让nodejs同步操作

众所周知,异步是nodejs中得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为:func1 -> func2 ->func3 )也是很常...

3219
来自专栏Golang语言社区

一起用golang之Go程序的套路

系统性地介绍golang基础的资料实在太多了,这里不再一一赘述。本文的思路是从另一个角度来由浅入深地探究下Go程序的套路。毕竟纸上得来终觉浅,所以,能动手就不要...

3042
来自专栏北京马哥教育

做到这二十条,Python程序性能轻松翻倍!

算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)...

1405

扫码关注云+社区

领取腾讯云代金券