版权声明:本文为Boyd Wang原创文章,转载时请注明作者及本文链接
本文链接:http://www.boydwang.com/2014/08/using-regex-implement-a-simple-string-format-method/

最近在学习正则表达式,看了deerchao的正则表达式30分钟入门教程,感觉收获不少,于是跃跃欲试的想要尝试一下,于是就想到了用正则表达式实现一个简单的string.Format方法。
我们知道,在.net中,string.Format是一个很强大的方法,可以把字符串转换成很多你想要的格式,今天就来尝试一下实现一个简单的根据大括号的参数顺序进行字符串替换的方法吧,比如我们使用

这句话最终的输出结果是:

我们今天就来试着实现一个Format方法,接受一个string类型的pattern,然后后面跟一个参数列表,传入替换的参数,最后返回一个替换过的string,方法的签名看起来像这样:

大体思路是利用正则表达式匹配出pattern中的大括号,然后把大括号中的数字拿出来,当做索引,在args数组里找到对应的参数,然后替换pattern对应的大括号(不考虑异常情况)。

匹配大括号的正则应该是这样的:

然后匹配出大括号中间的数字,可以直接用\d,为了保险起见,我用了零宽断言:

下面是实现:

然后我们写个测试方法测试一下:

顺利通过,OY!

好像到这就应该结束了,不过,我一时头脑发热,又加了一个测试case,用大括号去替换大括号:

然后它就失败了!为什么呢?因为大括号被替换了之后,在for循环的时候又被后面匹配的字符串又替换了一次,这个悲剧啊,我冥思苦想之后,发现了一个偷梁换柱的办法,先把所有字符串里的大括号用一个特殊字符替换掉,把正则也做相应的修改,这样被替换掉的字符串就不会被二次替换了,实现如下:

哇哈哈,我真是太聪明了,看到这,你一定会说,我擦,你这方法也太low了吧,好吧好吧,我知道你会这么说,然后我就从同事那偷学了一个高大上的方法,要用到的不再是string.Replace方法了,而是更高端的Regex.Replace,它可以接受一个委托用于处理要替换的字符串,这样就不会出现被重复替换的结果了,来看一下实现吧:

关于Regex.Replace的详细说明请参考MSDN

源码地址:https://github.com/boydwang/LearningNote/tree/master/Regex



打赏
Categories: C#程序开发

Boyd Wang

想给自己贴上各种NB的头衔,NB程序员,NB自由职业者,最后发现自己其实是个Newbie,没办法,慢慢来吧

Leave a Reply

Your email address will not be published. Required fields are marked *

无觅相关文章插件,快速提升流量