前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式游戏的答案

正则表达式游戏的答案

作者头像
企鹅号小编
发布2018-01-15 11:36:27
1.3K0
发布2018-01-15 11:36:27
举报
文章被收录于专栏:编程编程

两天过去了,我们才送出了四个番茄钟(其中一个还是作为礼物送给了鲁鸿驹先生,感谢鲁鸿驹的现场莅临指导 ,鲁总是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 的语法细节上。

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

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档