【图灵征文活动】

无论是在日常的一般工作中还是程序设计中,与我们打交道最为频繁的东西就是各种编辑器,不可否认的是,我们天天都在和那一串串、一行行的字符串打交道。对于程序设计者而言,字符串的处理那就更是家常便饭。

有时候,我们需要对大量的文本通过代码进行解析,以抽取关键内容;有时候,我们需要对各种用户的输入进行非常苛刻的、符合特定业务逻辑条件的合法性检查;甚至有时候,我们在工作中,需要手动对一些大文本进行 copy & paste 的操作,粘贴的文本之后可能需要做批量格式转换才能用在另外的地方(在我十多年的工作中,就经常遇到过这种问题。如果纯手工的操作,你会奔溃的!)。所以说,在我们的开发中,如何高效的处理字符串、提高效率就成为了每一个程序员日常工作中非常重要的一部分。

这一强大的工具就是正则表达式。几年前,对于刚接触正则的我,对于正则似乎有着一种在很多程序员看来非常不感冒的莫名的欢喜心和好奇心。于是,在网上一番搜索之后,买下了个这本看似名字很装逼,但实际上内容非常牛逼的大神作品《精通正则表达式》(第三版)。为什么说看似装逼呢?因为“精通”一词在茫茫书海中早已经被用烂了,凡是“精通XXX”基本上就和精通没啥关系了。就好像很多“XXX 高级编程”跟高级其实也没啥关系。

当你阅读完整本书并能完全理解的时候,不夸张的说,你就会有一种“被打通了任督二脉”的感觉。他不仅能帮你更好的系统性地理解正则表达式,而且还能帮你完善自己的逻辑思维,用正则去思考问题(think regular expression),用正则去解决问题。实际上,与其说能够帮助你在工作中更好地解决问题,倒不如说能够极大地提高你的工作效率。下面举两个平时工作中的例子:

比如:我们平时在发布应用程序的时候,config 文件是不能直接 copy paste 的,需要用自己的本地文件和 production 环境的文件进行比较,以确定哪些地方需要修改,但是有时候,程序并不是你写的,但是你接手了,你需要使用专门的文件比对工具对 config 文件进行比较。有时候你会发现,配置文件中会出现一个包含非常长的文本的节点(鬼知道他为什么要这么做)。文本密密麻麻的使用指定的分隔符(一般是分号/竖线等等)进行分割,但是并未换行,每一个分隔符之间的分段子串又套着指定格式的“马甲”或者“全裸”,即便设置了自动换行,比较器(即便是优秀的 beyondcompare)的显示结果中清晰直观的比对效果也会让你头晕,这个时候最好的方法就是使用正则先对文本进行替换,用换行替换分隔符,然后对文本进行比较,区别之处就显而易见了

再考虑以下场景。我有一个 XML 文件,里面包含了上万行的代码。根节点下面有若干个 <set> 节点,每一个 <set> 节点下面包含上千个 <identifier> 节点,每个 <identifier> 节点都有一个 value attribute,类似于 <identifier value="827373632" />,当进行测试的时候,我们需要对结果进行验证,验证最有效的方式就是抽取指定 <set> 节点下面的这些 <identifier> 的 value 的值,并将这些值加上单引号,并用逗号进行分割、拼接,但是呢,又不能拼成一整行,需要每 7 – 10 个 value 换一行,并且在头尾加上小括号,这样代码会看起来直观整洁。就像下面这样:

Select * from SomeTable
where productID in 
(
    ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’,
    ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’,
    ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’, ‘12345’,
    ......
)

类似的使用场景还有很多,以上这些都可以在 VS 编辑器中使用正则表达式进行替换,还有更为复杂的替换在此不一一列举,真的很强大。当使用正则语法替换出想要的东西瞬间刷屏的时候,会有一种莫名的舒心感~