冒着打开一堆蠕虫并获得负面投票的风险,我发现自己需要问,
我应该何时使用正则表达式,何时更适合使用字符串解析?
对于你的立场,我需要示例和推理。我希望您能解决可读性,可维护性,扩展等问题,以及最重要的性能你的答案。
我发现另一个问题Here只有1个答案,甚至不屑于举个例子。我需要更多了解这一点。
我目前正在使用C ++,但是正则表达式几乎都是高级语言,我想知道不同语言如何使用/处理正则表达式,但这更像是一种思考。
感谢您帮助理解它!
编辑:我仍然在寻找更多的例子,并就此进行讨论,但到目前为止的反应非常好。 :)
答案 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。