正则表达式 – 正则表达式字符串解析

有可能打开一罐蠕虫并得到负面投票,我发现自己需要问,

When should I use Regular Expressions and when is it more appropriate to use String Parsing?

我将需要你的立场的例子和推理。我想让您解决可疑性,可维护性,扩展性以及可能的大多数表现在您的答案。

我发现另一个问题Here只有一个答案甚至打扰了一个例子。我需要更多的了解这一点。

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

感谢您的帮助,了解它!

编辑:我还在寻找更多的例子,谈论这一点,但迄今为止的反应是伟大的。 🙂

最佳答案
这取决于你所处理的语言的复杂程度。

拆分

这是非常好的,当它的工作,但只有当没有逃避约定的工作。
它不适用于CSV,例如,引号字符串中的逗号不是正确的分割点。

foo,bar,baz

可以分裂,但是

foo,”bar,baz”

不能。

定期

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

If you need to match brackets ((...), [...]) or other nesting like HTML tags, then regular expressions by themselves are not sufficient.

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

显然,如果你写一个正则表达式,走开一杯咖啡,回来,不能轻易理解你刚才写的内容,那么你应该寻找一个更清晰的方式来表达你在做什么。 Email addresses可能在正确&可以使用正则表达式处理。

上下文无关

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

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

CF语法的经验法则是

If regular expressions are insufficient but all words in the language have the same meaning regardless of prior declarations then CF works.

无上下文

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

例如,在C中,

#ifdef X
  typedef int foo
#endif

foo * bar

如果foo是一个类型,那么foo * bar是一个名为bar的foo指针的声明。否则它是名为foo的变量名为bar的变量。

转载注明原文:正则表达式 – 正则表达式字符串解析 - 代码日志