这取决于您正在处理的语言有多复杂。
分裂
这在工作时很棒,但只有在没有转义约定时才有效。例如,它不适用于 CSV,因为引号字符串中的逗号不是正确的分割点。
富,酒吧,巴兹
可以拆分,但是
富,“酒吧,巴兹”
不能。
常规的
正则表达式非常适合具有“正则语法”的简单语言。由于反向引用,Perl 5 正则表达式更强大一些,但一般的经验法则是:
如果您需要匹配括号 ( (...)
, [...]
) 或其他嵌套(如 HTML 标记),那么仅靠正则表达式是不够的。
您可以使用正则表达式将字符串分成已知数量的块——例如,从日期中提取月/日/年。但是,对于解析复杂的算术表达式,它们是错误的工作。
很显然,如果你写了一个正则表达式,走开喝杯咖啡,回来,并且不能轻易理解你刚刚写的东西,那么你应该寻找一种更清晰的方式来表达你正在做的事情。 电子邮件地址可能是使用正则表达式可以正确且可读地处理的极限。
上下文无关
解析器生成器和手动编码的下推/PEG 解析器非常适合处理需要处理嵌套的更复杂的输入,因此您可以构建树或处理运算符优先级或关联性。
上下文无关解析器通常使用正则表达式首先将输入分解为块(空格、标识符、标点符号、带引号的字符串),然后使用语法将该块流转换为树形。
CF 语法的经验法则是
如果正则表达式不充分,但语言中的所有单词都具有相同的含义,而不管先前的声明如何,那么 CF 就可以工作。
非上下文无关
如果您的语言中的单词会根据上下文改变含义,那么您需要一个更复杂的解决方案。这些几乎总是手工编码的解决方案。
例如,在 C 中,
#ifdef X
typedef int foo
#endif
foo * bar
iffoo
是一个类型,then是一个名为 的指针foo * bar
的声明。否则,它是由名为 的变量命名的变量的乘法。foo
bar
foo
bar