regex - 正则表达式对比字符串解析

标签 regex string performance parsing language-agnostic

冒着打开一 jar 蠕虫和得到反对票的风险,我发现自己需要问,

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



我将需要 示例 推理 至于你的立场。我希望你解决诸如 之类的问题可读性 , 可维护性 , 缩放 ,可能最重要的是 性能 在你的回答中。

我发现了另一个问题 Here只有 1 个答案甚至麻烦举个例子。我需要更多来理解这一点。

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

感谢您帮助理解它!

编辑:我仍在寻找更多的例子并讨论这个问题,但到目前为止 react 很好。 :)

最佳答案

这取决于您处理的语言的复杂程度。

split

这在工作时很好,但只有在有 时才有效没有转义约定 .
例如,它不适用于 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 * barfoo 的声明指针命名 bar .否则它是一个名为 foo 的变量的乘法。通过名为 bar 的变量.

关于regex - 正则表达式对比字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905506/

相关文章:

performance - 32 字节对齐例程不适合 uops 缓存

Javascript 可选类型提示

Java删除文本文件中不需要的空格并替换为字符

regex - 找到包含字母表 {a, b} 上的子字符串 aba 的字符串的正则表达式? (形式语言理论)

python - Python 中的正则表达式反向引用问题

regex - Emacs Lisp 正则表达式匹配所有内容直到字符序列

c - 如何使用 strncat 而不担心缓冲区溢出问题?

java - 字符串中字符的位置和重复

用随机项替换 Python 字符串

javascript - JavaScript 中函数的大写是否会影响代码的解释方式?