【问题标题】:Why use regular expressions when a built in method will do the job? [closed]当内置方法可以完成这项工作时,为什么要使用正则表达式? [关闭]
【发布时间】: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


【解决方案1】:

当你说内置方法时,你是指这样的吗?

s = 'hello'
s.sub(/[aeiou]/, '*')  # => "h*llo"

因为那是一个正则表达式我的朋友。

或者你的意思是这样的?

s = 'foo'
s.include?('f')    # => true

您也许可以编写一些非常复杂的逻辑来查看某个东西是电话号码还是电子邮件地址。但事实是,一种模式将会以更快的速度实现。它实际上更简单。尝试使用 rubular 来习惯构建它们。我发现很多 ETL 任务都用正则表达式大大简化了。它们在整个行业都具有价值,而不仅仅是在 Ruby 中,这是学习它们的另一个原因。

【讨论】:

  • 您的顶级示例显然包括正则表达式,并且几乎不是我设想的更简单的示例之一。无论如何,你的最后一句话提供了一个很好的答案,虽然我应该强调,我从来没有问过为什么我们应该学习它们,我问过为什么人们会使用它们,特别是当其他方法可能在计算上更有效时。一个更好的例子可能是 s.gsub(/[aeiou]/, "")s.delete("aeiou")。似乎很多程序员首先接触正则表达式,我很好奇是否有我可能失踪的原因。
猜你喜欢
  • 2021-08-17
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2014-04-21
  • 2016-09-29
  • 2016-09-04
  • 1970-01-01
相关资源
最近更新 更多