正则表达式字符串解析

时间:2012-08-10 16:14:02

标签: regex string performance parsing language-agnostic

冒着打开一堆蠕虫并获得负面投票的风险,我发现自己需要问,

  

我应该何时使用正则表达式,何时更适合使用字符串解析?

对于你的立场,我需要示例推理。我希望您能解决可读性可维护性扩展等问题,以及最重要的性能你的答案。

我发现另一个问题Here只有1个答案,甚至不屑于举个例子。我需要更多了解这一点。

我目前正在使用C ++,但是正则表达式几乎都是高级语言,我想知道不同语言如何使用/处理正则表达式,但这更像是一种思考。

感谢您帮助理解它!

编辑:我仍然在寻找更多的例子,并就此进行讨论,但到目前为止的反应非常好。 :)

2 个答案:

答案 0 :(得分:30)

这取决于您处理的语言有多复杂。

分裂

这很有用,但只有在没有转义约定时才有效。 例如,它不适用于CSV,因为引用字符串中的逗号不是正确的分割点。

  

FOO,酒吧,巴兹

可以拆分,但

  

FOO,"杆,巴兹"

不能

正则表达式非常适合具有"regular grammar"的简单语言。由于反向引用,Perl 5正则表达式更强大,但一般的经验法则是:

  

如果您需要匹配括号((...)[...])或其他嵌套(如HTML标记),那么正则表达式本身是不够的。

您可以使用正则表达式将字符串分解为已知数量的块 - 例如,从日期中拉出月/日/年。它们是解析复杂算术表达式的错误工作。

显然,如果你写一个正则表达式,走开去喝杯咖啡,回来,并且不能轻易理解你刚写的东西,那么你应该寻找一种更清晰的方式来表达你的想法。做的。 Email addresses可能正处于人们可以正确和极限的极限使用正则表达式可读地处理。

无上下文

解析器生成器和手动编码的下推/ PEG解析器非常适合处理更复杂的输入,您需要处理嵌套,以便您可以构建或处理operator precedence或关联。

无上下文解析器通常使用正则表达式首先将输入分解为块(空格,标识符,标点符号,引用字符串),然后使用语法将该块流转换为树形式。

CF语法的经验法则是

  

如果正则表达式不足,但语言中的所有单词都具有相同的含义,无论先前的声明如何,那么CF就可以工作。

无上下文

如果您的语言中的单词根据上下文改变含义,那么您需要一个更复杂的解决方案。这几乎总是手工编码的解决方案。

例如,在C中,

#ifdef X
  typedef int foo
#endif

foo * bar

如果foo是类型,则foo * bar是名为foo的{​​{1}}指针的声明。否则,它是名为bar的变量乘以名为foo的变量。

答案 1 :(得分:8)

它应该是正则表达式和字符串解析 ..

你可以使用它们两个优势!很多时候程序员试图制作一个SINGLE正则表达式来解析文本,然后发现它很难维护。你应该在需要的时候使用它们。

REGEX引擎 FAST 。简单匹配只需不到一微秒。但不推荐用于解析HTML。