第一节介绍过RegexNode类,它的SplitWords用来分词,大致逻辑就是遍历要分词的字符串,不断的调用自身的Parse属性指向的委托,Parse属性指向一个bool ParseFunc(string input, int index, out string output)类型的委托,其中input表示要解析的字符串,index表示其实的解析位置,返回值表示否则匹配成功,output表示匹配... Read More
解析方法工厂是一个静态类,用于生成各种子模式的解析方法,这是正则引擎的核心部分,也是比较用技巧的部分,我们一种模式一种模式来分析。 最简单的匹配就是单纯字符串的匹配,我们用string.Compare就可搞定,如下 //abcpublic static ParseFunc MaxMatch(string str) { ParseFunc func = (string input, int ind... Read More
为了更好的评估代码写的哪里有问题,我把《代码大全》里核心的部分checklist整理出来了,大家可以大概过一遍,不一定每写完一个程序都要一条一条的去检查,但心里应该有这么一张检查表,在写代码和review代码时自然而然的想起来。 设计 设计是否经过多次迭代,并最终决定了最好的一个? 是否同时使用自上而下和自下而上的方法来解决设计问题? 类与类之间的交互关系是否已经设计为最小化? 设计被划分为层次吗... Read More
上一帖已经说过了大概的设计,第一步我们是要把输入的正则式构建成抽象模式树,我们先定义表示模式树的类。 public enum Releation{ Default, Or, And}public class PatternNode { public PatternNode() :this(null) { } public PatternNode(string text) { Text = tex... Read More
平时写代码肯定免不了犯错,如何减少犯错的机会呢,只能多加练习,多加注意。软件开发的难点是处理本质的复杂度,也就是业务逻辑本身的复杂性,而不是解决一些技术上的难题。作为开发人员,我们一方面要多看书,增加知识宽度,学习新技术,保持技术敏感,另一方面更要锻炼基本功,比如《代码大全》上写的那些,使用防御性编程,控制多层嵌套,有效使用递归,用伪代码设计子程序,练好code review本领等。 本系列就... Read More