regex 正则表达式与字符串解析

xzv2uavs  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(133)

冒着可能引起蠕虫和反对票的风险,我发现自己需要问,

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

我需要你的立场的例子推理。我希望你能解决的事情可读性可维护性可扩展性,可能最重要的是性能在你的答案。
我发现另一个问题Here只有一个答案,甚至懒得给出一个例子。我需要更多的理解这一点。
我目前在玩C++,但正则表达式几乎在每一个更高层次的语言,我想知道不同的语言如何使用/处理正则表达式,但这是一个事后的想法。
感谢您的帮助,了解它!
编辑:我还在寻找更多的例子和谈论这一点,但到目前为止的React是伟大的。

ua4mk5z4

ua4mk5z41#

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

拆分

当它工作时,这是很好的,但只有在没有转义约定时才有效。例如,它不适用于CSV,因为引号内的逗号不是正确的分割点。
foo,bar,baz
会被正确地分割但是
foo,“bar,baz”
不会的

正则

正则表达式对于具有"regular grammar"的简单语言非常有用。Perl 5正则表达式由于反向引用而稍微强大一点,但一般的经验法则是:
如果需要匹配方括号((...)[...])或其他嵌套(如HTML标记),那么正则表达式本身是不够的。
你可以使用正则表达式将一个字符串分成已知数量的块-例如,从一个日期中取出月/日/年。但是,它们不是解析复杂算术表达式的工具。
很明显,如果你写了一个正则表达式,出去喝杯咖啡,回来后,你不能很容易地理解你刚刚写的内容,那么你应该寻找一种更清晰的方式来表达你在做什么。电子邮件地址可能是一个人可以正确和可读地使用正则表达式处理的极限。

上下文无关

解析器生成器和手工编码的下推/PEG解析器非常适合处理更复杂的输入,您需要处理嵌套,以便构建或处理operator precedence或关联性。
上下文无关的解析器通常使用正则表达式首先将输入分成块(空格,标识符,标点符号,引用字符串),然后使用语法将块流转换为树形式。
CF语法的经验法则是
如果正则表达式不够,但语言中的所有单词都具有相同的含义,而不管前面的声明如何,那么CF就可以工作。

非上下文无关

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

#ifdef X
  typedef int foo
#endif

foo * bar

如果foo是类型,则foo * bar是名为barfoo指针的声明。否则,它是名为foo的变量与名为bar的变量的乘积。

zy1mlcev

zy1mlcev2#

应该是正则表达式与字符串解析..
你可以同时使用这两种方法!很多时候,程序员试图用一个正则表达式来解析一个文本,然后发现很难维护。
REGEX引擎FAST,简单匹配不到一微秒,但不推荐解析HTML。

相关问题