按 ‘ 正则表达式 ’ 标签归档

面试拒人连载

今天这位完完全全地折在技术上了。

他说他带一个技术团队,在一家知名的通信设备公司工作。行政上不带人,只是技术上带。我想,那一定是技术上很强了。问他擅长那种操作系统及那些编程语言,他说(简历上也这么写的):Linux系统,C/C++,Shell,说这些都是作为“基本功”,必须会的了。

C/C++的话题比较宽泛,因为他前面的陈述里提到过正则表达式,我就请他写匹配C语言里实数的正则表达式。

他提起笔,沉吟了一下,在纸上写:

/d+/./d+/

然后把纸转过来给我看。

我心里咯噔一下,他犯了至少四个错误:

表示“任何数字”的简写是“\d”,而不是“/d”。
小数点“.”在正则表达式里表示“任何字符”,如果想表示“小数点”的意思,则需要写“\.”。
他没考虑实数可能包含正负号。
他没考虑科学计数法,例如一个实数可能被写成3E8,意即3乘以10的8次方。

如果忽略掉头两个错误,他的表达式只能匹配最简单的小数,如3.14、12.7863、0.23等等,而以下数字都不能被识别:

2      虽然这个是“整数”,但人们的心理上希望程序能大度一些。
-3.5
5.2E8

我就提示他说,这个式子还可以改进一下吧,比如科学计数法的实数,你怎么处理?

他的表情,仿佛平生头一次听到“科学计数法”这个词一样。我只好说,就是像“3乘10的8次方”这种数字。看他还是茫然,我就说:你可以先打个草稿嘛,把“3乘以10的8次方”写在纸上,看着这个数写表达式就容易多了。

然后,我无比震惊地看到,他在纸上写下了:

3×108

写下这个数字,表明我面前这位仁兄,一定不是程序员。我来讲解一下:

首先是那个“x”,计算机的标准字符集没有乘号,几乎所有的编程语言都用“*”表达乘法。

其次是那个写成上标的“8”,程序是纯文本的东西,没有在程序里写上下标的可能。

我期望的正则表达式是下面这样的,那一定是太欺负他了:

^[+-]?\d+(\.\d*([Ee][+-]?\d+)?)?$