使用Nodepad++正则表达式替换的实用案例
Nodepad++虽然只能用于Windows,但作为一个免费开源编辑器,却是一个利器。一直非常喜欢,也是看最初的源码,才知道纯Win32的接口写出来的窗体程序,也可以做到如此精湛。比MFC那套的代码好多了。也正因如此,Nodepad++程序体积一直都很小。虽小,但功能却非常多,今天分享的是工作中会用到的利用正则表达式对文本进行替换。
行前添加字符
比较简单的,但可能经常会用到,在所有行前面加上某些字符,比如4个空格
替换前:

替换后:

^这个符号在正则表达式中表示行首。注意在面板下方的查找模式中,需要选中“正则表达式”选项,如果是只替换选中的部分,记得勾选“选取范围内”这个复选框,如果不勾选,则是对整个文件生效。将会在文件中的所有行前面加上4个空格。
行尾添加字符
替换前:

替换后:

$符号在正则表达式中表示行尾的意思。
在复杂信息中快速整合部分有用信息
根据需要,找到了一个 ICAO24的码表,虽然数据量并不大,但如果完全手动一条一条数据复制粘贴到我们的代码中,还是会耗费大量的时间,接下来就说明一下我们如何用Nodepad++的正则表达式替换功能来解决这个实际问题。
首先,查看网页源代码,然后把ICAO24的表格数据复制到Nodepad++新建的文件中,如下:

从上图中中可以看到,这里有很多无用数据。对于我们来说,我们需要的是第一列的Country和第三列的地址范围,其他的都不需要。所以,得想办法把无关紧要的东西先排除掉。按照顺序,我们先去掉每一行前面的<tr class='odd'>这样的数据:

如上图,直接把匹配的字符串替换为空,就去除了。然后,按照同样的方法再干掉不需要的第二列:

用同样的方法,再把范围列之后的所有数据都干掉:

这个时候,就只剩下了我们需要的Country列和地址范围列,数据干净多了。根据需要,应该把范围的起始地址和结束地址取出来,并直接整合到我们的代码中,下面先把Country和范围分行:

注意,可以使用\n表示换行。换行后,就可以提取范围的起始和结束值,并整合进代码中,假设我们使用c++的vector来存储,变量名为acio24Ranges,那么我们可以这样做:

注意:在上图中,替换为里面有点新知识,就是"\1",这个地方代表的是正则表达式里面的第一个(.*)的内容,以此类推,第一个(.*)就用"\2"表示。这样就能做到原封不动的保留我们需要的字符。最后我们就只剩下处理Country了,假设我们使用c++的vector来存储,变量名为countries,处理手法同上:

如上图所示,这样我们就得到了我们想要的数据,并整合进代码中。
上面的步骤还可以优化,有兴趣的朋友可以自己试试,我只在这里抛块砖而已。希望大家能有效利用这个功能,提高工作效率,真正得到实惠!有不明白的地方,可以加Q群280689979 进行沟通交流。