43

冒着打开一罐蠕虫并获得反对票的风险,我发现自己需要问,

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

我需要关于你的立场的例子推理。我希望您在回答中解决诸如可读性可维护性、可扩展性以及可能最重要的性能之类的问题。

我在这里找到了另一个问题,它只有 1 个答案,甚至不屑于举个例子。我需要更多地理解这一点。

我目前正在使用 C++,但正则表达式几乎在每一种高级语言中都有,我也想知道不同的语言如何使用/处理正则表达式,但这更多是事后的想法。

感谢您帮助理解它!

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

4

2 回答 2

39

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

分裂

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

富,酒吧,巴兹

可以拆分,但是

富,“酒吧,巴兹”

不能。

常规的

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

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

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

很显然,如果你写了一个正则表达式,走开喝杯咖啡,回来,并且不能轻易理解你刚刚写的东西,那么你应该寻找一种更清晰的方式来表达你正在做的事情。 电子邮件地址可能是使用正则表达式可以正确且可读地处理的极限。

上下文无关

解析器生成器和手动编码的下推/PEG 解析器非常适合处理需要处理嵌套的更复杂的输入,因此您可以构建或处理运算符优先级或关联性。

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

CF 语法的经验法则是

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

非上下文无关

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

例如,在 C 中,

#ifdef X
  typedef int foo
#endif

foo * bar

iffoo是一个类型,then是一个名为 的指针foo * bar的声明。否则,它是由名为 的变量命名的变量的乘法。foobarfoobar

于 2012-08-10T16:51:51.067 回答
9

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

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

正则表达式引擎速度很快一个简单的匹配不到一微秒。但不推荐用于解析 HTML。

于 2012-08-10T16:44:47.763 回答