这样做的原因是,我们正在评估一个soap头的动作,在它被解析成可通过WCF的OperationContext对象管理的东西之后,然后作出决定.现在,简单的解决方案似乎是基本的子字符串,以保持实现简单,但是我的一部分想知道RegEx是否会更好或更强大.我的其他部分想知道是否会像在我们特定情景中使用霰弹枪来杀死一只苍蝇.
所以我不得不问,当试图通过典型的字符串解析来决定使用RegEx时,人们使用的典型阈值是多少?请注意,我在正则表达式中不是很强大,因此,我试图回避,除非绝对重要的是避免引入比我需要的更多的并发症.
如果你不能用我的缩写来说明这一点,那就是.NET的土地(C#),但是我相信这对这个问题没有太大的影响.
编辑:看起来像我典型的雷霆魅力,我在问题上已经太冗长或误导了.我想道歉我给了一些背景,帮助提供我在做什么的线索,而不是误导人.
我基本上正在寻找一个关于何时使用子字符串及其变体与正则表达式相反的指南,反之亦然.虽然一些答案可能错过了这个(再次是我的错),但我真的非常感谢他们,并相应地投了赞成票.
我希望这有帮助.
在目标语言的语法递归的情况下,一个重要的指导方针(尽管我看到人们一直在尝试)真的很难回避.
例如,考虑一个用于评估括号算术表达式的微小的“表达式语言”.这种语言的“程序”示例如下所示:
1 + 2 5 * (10 - 6) ((1 + 1) / (2 + 2)) / 3
一个语法很容易写,看起来像这样:
DIGIT := ["0"-"9"] NUMBER := (DIGIT)+ OPERATOR := ("+" | "-" | "*" | "/" ) EXPRESSION := (NUMBER | GROUP) (OPERATOR EXPRESSION)? GROUP := "(" EXPRESSION ")"
用这个语法,你可以在jiffy中构建递归下降解析器.
一个等效的正则表达式是非常难写的,因为正则表达式通常不会很好地支持递归.
另一个很好的例子是JSON摄取.我看到人们试图用正则表达式消费JSON,而且是INSANE. JSON对象是递归的,所以他们只是乞求常规语法和递归下降解析器.
嗯…看着别人的回答,我想我可能已经回答了错误的问题.
我把它解释为“什么时候应该使用一个简单的正则表达式,而不是一个完整的解析器?而大多数人似乎把这个问题解释为“你什么时候应该滚动自己的笨拙的特别逐字符验证方案,而不是使用正则表达式?”
鉴于这个解释,我的答案是:永远不会.
好的….一个编辑.
我会多一点宽恕自己的方案.只是…不要称之为“解析”:o)
我认为一个很好的经验法则是,如果您可以使用单个谓词来实现所有逻辑,则只应使用字符串匹配原语.喜欢这个:
if (str.equals("DooWahDiddy")) // No problemo. if (str.contains("destroy the earth")) // Okay. if (str.indexOf(";") < str.length / 2) // Not bad.
一旦您的条件包含多个谓词,那么您已经开始创建自己的特殊字符串验证语言,您应该只需掌握并学习一些正则表达式.
if (str.startsWith("I") && str.endsWith("Widget") && (!str.contains("Monkey") || !str.contains("Pox"))) // Madness.
正则表达式真的不是很难学习.相对于具有数十种关键字,原始类型和运算符的C#,以及具有上千个类的标准库的huuuuge全功能语言,正则表达式绝对是简单的.大多数正则表达式实现支持大约十几个操作(给或取).
这是一个很好的参考:
http://www.regular-expressions.info/
PS:作为一个奖励,如果您想要学习编写自己的解析器(使用lex / yacc,ANTLR,JavaCC或其他类似工具),学习正则表达式是一个很好的准备工作,因为解析器生成器工具使用许多同样的原则.