正则表达式小试牛刀

闲来无事,打开以前找工作时打印出的资料,说面试官怎么考正则表达式呢?

实际问题
比如你进了我们组工作,我们组老大对代码的格式要求很严格,要求左右小括号前后都有空格(仅仅举例)。
那么我给你一些源代码(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. 正则表达式

原文地址:https://www.cnblogs.com/xianzhon/p/6246734.html