闲来无事,打开以前找工作时打印出的资料,说面试官怎么考正则表达式呢?
实际问题:
比如你进了我们组工作,我们组老大对代码的格式要求很严格,要求左右小括号前后都有空格(仅仅举例)。
那么我给你一些源代码(c/c++,java),你来检测并修正这些不合规则的代码,你有两天时间,你怎么做?
简单说,下面(1)是给你的输入(foo.c), (2)是正确的输出。
(1) foo (bar ( new Point(x, graph.getY()) ));
(2) foo ( bar ( new Point ( x, graph.getY ( ) ) ) ) ;
答案:
一条sed命令即可搞定
1 sed -i -r "s/([^ ])([(|)])/ 1 2/g 2 s/([(|)])([^ ])/1 2/g" foo.c 3 4 或者放一行(不建议) 5 sed -i -r "s/([^ ])([(|)])/1 2/g;s/([(|)])([^ ])/1 2/g" foo.c
解释:
sed - 按行处理文件的文字处理工具
-i - (in place) 替换文件本身
-r - (regexp-extended) 使用扩展的正则表达式
() - 分组
[^abc] - 除a,b,c集合以外的一个字符
1 - 引用分组, 依次到9
g - (global)对每一行找到的匹配全部替换
a|b - 或运算符,匹配两个字符中的一个
补充说明:
看了资料上给的"标准"答案:
1. 使用Unix命令如sed(利用正则表达式)
2. 其他的编辑器,利用正则表达式替换
3. 快速写一个ruby脚本
4. 找个IDE,格式化一下
任何一种方法,面试者都要解释清楚怎么做的才行。
例如在vim里面,可以通过两次替换做到(需要注意,()是字符, ()才是正则表达语法, []|都是相同):
:%s:([(|)])([^ ]):1 2:g
:%s:([^ ])([(|)]):1 2:g
更多更全面的正则表达式介绍可以参考博文:
1. 正则表达式