【发布时间】:2022-01-27 09:19:04
【问题描述】:
我没有在 SO 上花费大量时间,但是在我在这里度过的时间里,我注意到很多地方使用/建议使用正则表达式把戏就好了。我的问题是这样的:
为什么这么多人似乎如此依赖正则表达式?这只是习惯,因为它更灵活吗?你们中的一些人是否觉得它更具可读性?是因为它需要更少的打字吗?
我什至不愿列出示例,因为我知道每个示例都不可避免地会引发其独特的论点,并且在很大程度上违背了我提出一般问题的目的,但是根据我更好的判断,让我们从这个示例开始:
我想使用以下字符串并删除所有多余的换行符:
str =
"Useful Line 1 ....
Useful Line 2
Useful Line 3
Useful Line 4... \n
Useful Line 5\r\n
Useful Line 6\n\r
Useful Line 7\n\r\n\r
Useful Line 8 \r\n\r\n
Useful Line 9\r\r\rUseful Line 10\n\n\n\n\nUseful Line 11 \rUseful Line 12"
我的正则表达式可能没有尽可能高效,但答案似乎是这样的:
str.split(/[\n|\r]+/).join("\n")
...比这样的答案更普遍:
str.gsub("\r", "\n").squeeze("\n")
...尽管后者似乎总是更快地进行基准测试:
Rehearsal ---------------------------------------------
regex 0.000000 0.000000 0.000000 ( 0.000024)
non_regex 0.000000 0.000000 0.000000 ( 0.000015)
------------------------------------ total: 0.000000sec
user system total real
regex 0.000000 0.000000 0.000000 ( 0.000022)
non_regex 0.000000 0.000000 0.000000 ( 0.000015)
只是重申一下,我真的只是在寻找一个非常笼统的答案,说明为什么一个人会在实际上没有必要时选择正则表达式。同样,我只是发布了一个简单的示例,该示例可能有一些独特的理由,但这并不会改变主要问题
我问的原因是,虽然我完全理解正则表达式有多么有用,但我个人发现它们真的很难阅读,而且我知道它们几乎总是(如果不是总是)执行速度较慢。所以我尽可能地避开它们。我应该重新考虑我的方法吗?如果是这样,为什么?
【问题讨论】:
-
如何在没有正则表达式的情况下实现 /a*b/ 之类的东西?你做了什么来断言它更快/更具可读性?
-
@wobr,我的目标不是争论正则表达式是明显解决方案或唯一方法的具体示例,但即使在您的示例中,
a = [2, 12, 33, 24, 55];a.index (/a[0]*a[1]/)的执行时间是a.index (a[0]*a[1])的 2 到 3 倍。而且我已经说过,我个人觉得正则表达式很难阅读。关于“更快”:我指的是基准时间。 -
我不是在争论。我想看一个具体的例子来讨论。例如,您的示例没有预编译正则表达式,因此需要考虑到这一点。我见过在生产中合理使用正则表达式的地方是词法分析器,这些词法分析器通常是相当积极地优化的 IIRC。
-
@MichaelB 在这两个问题(以及许多其他类似问题)中使用正则表达式的原因是灵活性。采取this one for example 是的,您的解决方案适用于
"-215000695716b.ct.domain.com.br",但您能保证该字符串吗?当它变成"-215000696716b.ct.domain.com.br"时会发生什么?现在您的解决方案没有达到预期的结果,因为 1 个字符发生了变化,您必须在正则表达式解决方案继续进行时调试发生这种情况的时间、地点和原因。 -
很多时候,它是关于为尚未看到但可以合理预测的可能性进行规划。正则表达式是关于模式匹配而不是平等,这就是它的亮点
标签: ruby