每个程序员都必须学习正则表达式吗?[关闭]


82

我是编程新手,在一次采访中我遇到了一个关于正则表达式的问题;不用说我无法回答。所以我想知道我是否应该学习正则表达式?所有领域的每个程序员都必须这样做吗?还是对某些特定领域进行编程是必须的?

相关问题:


55
我个人知道它们是什么,何时使用它们以及如何使用Google语法。耸耸肩
Tyanna

35
这是所有高级用户的必备条件。程序员必须是高级用户才能提高生产力。
SK-logic

8
您为什么不想学习它们?您已经至少遇到一种情况,从中了解它们会为您带来好处。难道不是您将来可能会遇到类似情况的理由吗?
FishBasketGordo'2

23
只有那些使用文本的人才可以:)
史蒂夫·杰克逊

Answers:


113

正则表达式是一种非常方便的工具,可用于多种语言,大多数开发人员迟早都会学习它们。

对于面试官来说,这是在面试中探寻经验的好方法。如果您正在面试一些声称拥有多年经验的人,而他们却不理解他们,则需要进一步挖掘。


4
我同意,这对任何经验丰富的开发人员都是一个好问题。但是,问一个没有工作经验的应届毕业生可能有点不公平-除非他们真的想筛选出完全没有实际编程经验的申请人。
SK-logic

2
@ SK-logic:取决于学校。我们在第二年都有一门必修课,大量使用了正则表达式(我承认,这是我迷上了正则表达式的地方;))。尽管不曾如此激烈,但有几次以上的高等课程再次使他们成长。
FrustratedWithFormsDesigner 2012年

同意上述意见-我不希望刚从学校毕业的人一定知道正则表达式。但是我可能仍然会问。
ptyx 2012年

13
我是数学家,所以我没有计算机科学方面的正式背景,但是我会认为正则表达式实际上是在大学课程中教授的,同时还讨论语法,解析器,自动机等。我实际上希望刚大学毕业的人会比没有CS学习的经验丰富的程序员更好地了解。:-/
Andrea

8
@Andrea,当我上大学(获得计算机科学学士学位)时,在学习语法和自动机时确实涵盖了正则表达式。但是,仅涉及正式概念,而不涉及应用程序。我们没有学习POSIX或Perl兼容的正则表达式语法,也没有学习如何在编码中使用它们。我们学习了如何绘制有限状态自动机的状态图,将其写为正则表达式等。涉及希腊字母,而不涉及grep和文本文件。
亚当·贾斯基维奇

54

正则表达式是一种工具。它恰好是一个非常有用的工具,因此许多人选择学习如何使用它。但是,除了学习其他内容的“需求”之外,您没有“要求”来学习如何使用此特定工具。


19
这就是说理解布尔逻辑很有用,但不是必需的。
Oded 2012年

1
@Oded:我的课程中所教的布尔逻辑没有任何用处。
DeadMG

16
@DeadMG,我一直使用布尔逻辑,例如在转换中:if (!(foo && bar))=> if (!foo || !bar)。也许您一直在使用它,而没有意识到,或者您没有学会正确的材料。
zzzzBov 2012年

7
喜欢版本控制吗?还是软件测试?
康拉德·鲁道夫

2
@ruakh-我同意它们非常有用;我一直在使用它们。我认为所有程序员都应该在职业生涯的某个时候学习如何使用正则表达式。但是,问题没有问。
eykanal'2

33

如果例如游戏程序员或LHC的程序员从未学习过正则表达式,我不会感到惊讶。我什至可以给游戏程序员提供不了解SQL的权限。

但是,如果您在任何类型的信息系统中工作,并且不知道正则表达式,那么对您自己是有害的。

另一方面,我不希望您的标准IS程序员了解游戏程序员所熟悉的矩阵数学。程序员有不同的学科,但是我们必须属于“信息系统”范畴。


1
LHC的程序员可能使用正则表达式来搜索传感器生成的数据文件。游戏程序员可能会使用正则表达式来搜索其游戏产生的日志文件。好的,他们可能不必这样做,但这可能会使这样的任务容易得多。
FrustratedWithFormsDesigner 2012年

1
我同意,但是如果我正在接受游戏程序员职位的面试,那么即使他们不知道正则表达式是什么,我仍然会雇用他们。如果我以传统的业务编程角色雇用了一个不知道正则表达式的人,则可能不会雇用他们。
乔纳森·里奇

我想这很公平。
FrustratedWithFormsDesigner 2012年

7
粒子物理学家大多在与Unix相似的环境中工作,但与该社区中与计算机相关的所有其他事物一样,大多数技能都是通过口头传统传播的。正则表达式的复杂程度各不相同。但是我们不使用正则表达式搜索数据数据太多,而且不是文本格式。就像其他人一样,我们搜索日志,临时数据库,代码和半成品文档。
dmckee'2

1
@FrustratedWithFormsDesigner,我不会雇用不了解正则表达式的游戏程序设计师。编程本质上是信息密集型的,与领域无关。不管您做什么,在任何领域中都有源代码,具有正则表达式的文本编辑器和日志文件。没有正则表达式,您执行某些任务的效率大大降低(即使您不需要在出厂的游戏中编写一行正则表达式)。我并不是说正则表达式对于游戏程序员来说是必需的。我只是说我不会雇用一个不知道的人。
李·李

22

正则表达式是表达如何匹配文本模式的一种非常简洁的方法。

在编程中经常会提出从文本中解析和提取数据或验证某些文本是否符合特定模式的要求,所以我想说是的,了解并理解它们很重要。

它们是您工具箱中的好工具,我希望任何有经验的程序员都知道如何使用它们。

Jeffery Friedl的书“ 掌握正则表达式”是了解正则表达式的最佳资源之一。它相当高级,因此您可能需要在有更多经验后才真正阅读它。

你可以用开始教程regular-expressions.info


2
对我来说这是一个品味问题。我从来没有真正需要它们。我已经在一些项目中使用了它们,所以我知道它们是如何工作的,但是如果没有它们,我很容易上手,看到它们被滥用的次数比我对它们的需求要多。为了简化模式,您不妨使用字符串操作来使其复杂,并且至少在您喜欢我喜欢使用解析器的情况下,使用(e)BNF更快
Rune FS

15

与这里的大多数答案相反,我认为对正则表达式的了解不是成为一名高效程序员所必需的技能。当我面试应聘者的职位时,如果他们感到被迫提高自己的注册技能,我会更深入地挖掘自己。为什么?它们之所以经常在某些地方使用是因为它们喜欢正确的锤子,但是通常您需要的是螺丝刀。在SO中搜索HTML和正则表达式,您会看到很多问题以及正则表达式不合适的许多原因。

在我主张雇用正则表达式的知识之前,我当然不要求必须具备适当的OOD能力。而且我实际上不认为有人相信您可以成为了解正则表达式的生产力更高的程序员,但是缺乏诸如分析,设计和所用框架知识之类的领域

当然,有时候它们很方便,但是在我作为专业开发人员20多年的时间里,我认为我在代码中使用它们的次数不到20次(甚至我已经编写了一些perl脚本),我确实经常使用它们进行搜索和虽然取代。


不知道正则表达式的程序员通常会在正则表达式很好地工作时创建大量的WTF。只知道正则表达式的程序员通常会创建较小但严重错误的WTF,以尝试使用正则表达式处理非正则语言(例如HTML)。
凯文·克莱恩

14

无论您从事哪个领域的工作,正则表达式都是一个有用的工具,因为大多数编程语言都是纯文本编写的。因此,正则表达式是一种处理和重构源代码的好方法,它内置于许多文本编辑器中。我已经看到无数的程序员在使用正则表达式进行更改时可以对源文件进行重复更改,从而使更改更快,更准确。

这就是实用程序员的第3章谈论的内容,纯文本是“编程的基本原料”。


您为什么不只使用支持重构的思想呢?
NimChimpsky

2
如果我在这篇文章中提出了问题,我会给您打勾的标记。这是我永远不会雇用不了解正则表达式的人的最重要的单一原因。即使您不需要编写使用它的单行代码,它也是一个功能强大的代码编辑日志搜索工具。一个不知道它在某些日常任务中的效率会降低几个数量级的人。
李·李

10

杰夫·阿特伍德(Jeff Atwood)写了一个很棒的关于正则表达式的博客,其中引述了一个惊人的说法:

Some people, when confronted with a problem, think "I know, I'll use regular 
expressions." Now they have two problems. [Jamie Zawinski]

对于一个好问题,您可能想检查一下堆栈溢出也有一个很好的答案

您应该对此有所了解。正则表达式易于学习,但难以掌握。您无需学习任何有关它的内容就可以开始使用它。明智一点。

 

tl; dr

您需要了解该技术,以便可以正确决定何时使用它。


8

我在没有正则表达式库的嵌入式代码库中工作。某项任务需要275行代码,并且花了大约两周的时间来调试所有极端情况,在测试人员和开发人员之间来回调试。后来,我编写了一个函数来作为javascript实用程序的一部分执行相同的操作。使用正则表达式执行的完全相同的任务使用了10行代码,并且在15分钟左右即可完美运行。

您是否需要正则表达式?从技术上讲不是这样,但是故意对有效的工具一无所知是愚蠢的。


6

引用另一个答案:

正则表达式是表达如何匹配文本模式的一种非常简洁的方法。

因此,如果这是您工作的重要部分,那么可能会有更好的方法来设计您正在开发的系统。除非大量文本是您所在地区的特定领域(例如生物信息学)。

我曾在三种不同的企业系统上工作(十年来曾在三家不同的公司使用),而我编写它们的时间还不到五次,其中包括将基本电子邮件验证程序复制和粘贴两次。


2
许多文本始终是特定于域的。毕竟您是一名程序员。文本(以源代码的形式)是您的域。使用正则表达式有效地处理文本使您成为更高效的程序员。
量子点

2
@quanticle没有任何意义。您实际上使用正则表达式来操纵源代码吗?这听起来像是一场噩梦。正则表达式是代码的一部分,并且代码与特定于域的数据进行交互。
NimChimpsky

3
我确实使用正则表达式来操纵源代码。手工重构大块代码很繁琐且容易出错。使用支持正则表达式查找和替换的编辑器(提示:几乎每个编辑器都支持正则表达式查找和替换)使重构变得容易得多。
2012年

3
@Dunk他并不是说这在整个项目生命周期内都会带来巨大的效率提升,而是在很小的时间内带来巨大的收益。我还重构了数十个文件中有成百上千个更改的位置。在项目的整个生命周期中,节省的时间微不足道,但是我当然不希望花时间或几天来手动进行相同的更改。现代IDE可以在不编写正则表达式的情况下为您完成某些工作,但有时却不行(例如,重新编写常见的分配模式)。
jmoreno'2

2
@NimChimpsky Regexps随处可见。IDE和重构工具仅适用于特定语言。例如,您的重构工具是否可以让我浏览所有模板并查找/删除看起来像电话号码的字符串(sites.google.com/site/steveyegge2/…)?
2012年

4

正则表达式可以被认为是一种非常有用的跨语言,跨平台的处理工具。我可以在代码中使用regex,可以在编辑器中使用regex,也可以在命令行上使用regex!

不仅仅是您需要或应该学习它们。更像是

哇!我喜欢正则表达式!


4

成为一个优秀的程序员,您不需要完全了解所有小的regex怪癖,特别是因为它们在不同的实现和编程语言周围往往会有所不同。什么,你需要知道的是

  • 什么是正则表达式和正则表达式。
  • 他们有效地执行哪些操作(解析常规语言)
  • 什么样的东西是无效的(解析嵌套的东西,使用大量的反向引用)
  • 每当您需要阅读或编写一种语法时,可从何处获取有关语法的信息。

无论如何,您甚至不必担心最初需要学习太多的精力。最简单的操作符(.*|(),等)几乎普遍存在并走路!


我认为这是一个很好的观点。知道如何使用某些RE引擎的反向引用和其他高级功能仅会适度有用。在许多/大多数情况下,将RE的使用与少量逻辑结合起来更易读且易于维护。
马克·贝西

3

如前所述,Regex是一个工具,非常有用的工具恕我直言。

考虑以下示例:

//fomat number using string.replace and regex in javascript
function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
} 

只需一行即可将例如1000000.00这样的数字转换为“ 1,000,000.00”

使用任何其他方法将更加复杂


2
这不复杂吗?它使用了标准正则表达式集中没有的几个特殊功能。一个简单的长度和填充就可以了
棘轮怪胎2012年

2

这不是必须的。您只需要了解它们的存在以及何时使用它们。使用Google和在线工具很容易找到语法正确的地方。


2

我真的建议您学习正则表达式。在工作中,当我们招聘程序员时,不知道正则表达式的应聘者通常会很快被辞退。不是因为他们绝对需要知道正则表达式,而是因为它很好地表明了他们对编程的理解程度以及编程成瘾的程度。

真正的程序员知道他们的正则表达式

但是,这有点偏颇,因为我主要参与Web编程,因此在服务器端和客户端,正则表达式肯定会遇到很多问题。如果您是洗碗机内置系统的汇编程序员,则可能根本不会遇到正则表达式。但是它仍然可能会派上用场,因为在大多数情况下,只要您知道正则表达式(搜索和替换,搜索文件,搜索多个文件等),您就可以利用开发环境。

此外,如果您确实知道,您会发现更容易被其他程序员认可。


另外,一开始要认真地学习完整的规范是徒劳的,因为有许多不同的方言。相反,请尝试着重于学习基础知识:(1)编写一些简单的正则表达式并了解的含义。* + {} []()和-以及一些基本类。(2)掌握给定的规格,尝试了解遇到的正则表达式中发生了什么。
Aron Cederholm'2

您在网络开发人员中使用reg exp做什么。这是我的工作,我十年来使用了5次以上。
NimChimpsky

对于初学者:解析或验证用户输入(例如,电子邮件,邮政编码/邮政编码,用户搜索表单)。而且对于I18n和l10n而言,还可以使用多种语言/语言环境定制和可变翻译字符串。他们肯定会从一些错误检测和大量错误处理中获得帮助。并在CMS /博客/评论世界中获得Wiki /论坛标记。对于外部数据(用户输入,抓取的页面,同步的资源等),内容,链接/内容的解析,处理和重写。再加上用于所有大量统计目的和日志记录(浏览器检测,引荐排序等等)
Aron Cederholm

-1这样疯狂地无知的评论“一个真正的程序员……”
Dunk 2012年

这是一种验证用户输入的相当肤浅的方式,如果您的正则表达式准确率100%(电子邮件验证是著名的一种),我将感到惊讶。而且我不喜欢使用regex的-er wtf在语言之间进行翻译的“多种语言/语言环境的自定义和可变翻译字符串”吗?统计目的-您是否使用正则表达式进行统计?用正则表达式重写链接/内容听起来像是我的代码气味。
NimChimpsky 2013年

1

是必须的吗?您已经知道自己必须知道的内容:它们的存在,它们的用途以及用途。作为程序员的工作是解决问题。您现在已经足够了解,可以开始将它们纳入解决问题的解决方案中。您应该学习正则表达式吗?绝对。优先级由您决定...有些工作每天将被使用,而某些工作将永远不会被使用。一个简单的指南就是与您期望遇到的问题匹配多少模式。


1

嗯,我需要用逗号分隔并输出此字符串列表,让我编写一个包含带分隔符参数的for循环的函数,然后将它们附加在一起……或者我可以只使用现有的“ join”命令。

我需要根据每个对象具有的几个属性对这些复杂的对象进行排序,让我提醒自己如何编写一个可以执行此操作的排序函数,哦,不用等待,我可以使用该语言支持的现有标准排序函数。我将必须学习如何编写自定义比较器,但这应该不会太困难,它显然比维护我自己的排序函数要好。

我对虚拟方法的想法感到有些害怕,但是它应该可以帮助我减少这些列表,每个列表用于不同类型的项目,直到单个列表。然后,我不必编写六个类似的语句以不同的方式处理每个列表。猜猜我应该努力学习并学习这些东西,因为如果这样做的话,我的代码将变得更加简单和简洁。

我需要从此文本文件中提取所有其他杂音中的这些成对的单词和值,让我写一个五十行的解析器来逐个读取字符,如果其中一个字符看起来像是我的开头寻找我将设置此状态变量并开始以不同的方式解析它,依此类推等等……当然,我的情况显然如此特殊,没有其他人之前遇到过这样的问题,并发明了一种通用解决方案,占用一行的代码来做到这一点。那使我想起了我应该把那些我从未读过的编程书籍带到二手书店。


1

简短的回答:不,但是……知识就是力量。

我是一名Web开发人员,我发现我通常需要的所有正则表达式都已经为我编写了。但是,我在复制和粘贴时遇到了问题,并且没有意识到它在做什么或不做什么,这是复制和粘贴任何内容的危险。

一个示例:我复制并粘贴的电子邮件正则表达式在电子邮件地址规范中不允许使用句号或加号。实际上,许多人将gmail与realemail+sitename@gmail.com结合使用,这样,如果他们选择垃圾邮件,就很容易过滤“ sitename”。


0

常用表达?嗯...有时候了解它们很有用,但是大多数时候您总是使用相同的语言。我经常使用正则表达式,但是我不会说我很满意。我一点都不喜欢它,我认为要知道的比正则表达式还要重要。

但是在验证配方设计师或数据时非常有用。我认为几乎所有专业表格都可以通过正则表达式进行验证。ASP.NET使用它。

但是,根本:请在需要时尝试执行一个表达式并将其保存。希望您会多次使用它们。但是不要浪费时间与RegEx!


0

这取决于您工作的区域/平台

  1. 对于桌面应用程序,您可以在不了解正则表达式的情况下过得很愉快。但是请注意,Visual Studio具有正则表达式搜索,但是我想知道是否有人定期使用它。我在想(您必须先修复正则表达式,因为您可以进行搜索:))。

  2. 作为Web开发人员,您很可能必须学习正则表达式。之所以可以使用它,是因为您可以轻松地在线找到满足您需要的代码段,但学习会有所帮助。

在文档,诉讼,法律资料等领域,正则表达式是必不可少的工具。你一定要知道 如果不这样做,您将根本无法获得工作。

简而言之,如果它不是工作说明的一部分,那么甚至不必理会它。如果您想学习它,请学习它。


0

正则表达式是非常有用的工具,并且在很多情况下程序员应该使用它们。您不应该全心全意地学习使用它们。只需使用参考并完成您的任务即可。在使用了正则表达式的10-20-50-100(具体取决于程序员)任务完成之后,您将完全了解它们。它们是自己学习的,您不应该专门学习它们。


0

我已经看到了许多答案,但是它们似乎都是关于将正则表达式作为程序员工具箱中的一种工具的优点的。

我更喜欢将正则表达式视为一种知识,可以扩展人们对计算机工作原理的理解。一旦某人真正了解了常规语言,并且您可以通过三个简单的操作来表达它,我相信它为他们提供的不仅仅是简单的验证简单字符串的工具。

他们可以更好地理解一般的解析,这对每种编程都非常有用,并且可以更好地了解我们定期使用的工具(编译器,编辑器,浏览器等)如何工作。

使用正则表达式的实际好处当然是巨大的。即使您不对它们进行“编程”,我也一直使用正则表达式在编辑器中进行查找/替换,并衡量它们使我的工作效率更高。

因此,尽管没有必要,但我认为它是程序员应学习的首批工具之一。


0

Rob Pike 并不这么认为

正则表达式很难编写,很难编写,并且相对于其他技术而言可能很昂贵。标准的词法处理和解析技术非常易于编写,通用且适应性强,因此无需使用正则表达式。

另一种看待它的方式是词法分析器和解析器匹配静态定义的模式,但是正则表达式的优势在于它们提供了一种动态表达模式的方法。它们在文本编辑器和搜索工具中非常有用,但是当您在编译时知道要查找的所有内容时,正则表达式带来的通用性和灵活性远远超出了您的需要。

鼓励将正则表达式作为解决所有文本处理问题的灵丹妙药,这不仅是懒惰和糟糕的工程,而且还加强了本来根本不应该使用它们的人们的使用。

值得注意的是,Pike承认他们拥有自己的位置,当然,恕我直言,正则表达式是一种非常强大的工具,绝对值得我花时间学习使用,从这个角度来看,我绝对建议学习他们。但是,真正的问题可能是它们是一个创可贴,这让我对应有的词法分析和语法了解不足。:)


0

我只想说一下,正则表达式通常是完成任务的正确工具,并且非常方便,特别是对于执行大量文本处理的应用程序。但是,记住它们是疯狂的。我在墙上贴了一个备忘单,上面有所有特殊字符,锚点,字符类,模式修饰符,元字符...只需花20分钟的时间,学习如何使用它们并获得备忘单即可跟踪其他一切。您需要它们的唯一目的是能够在需要时编写一个正则表达式,通常大约每6个月一次-遇到问题的频率通常是它们是最适合工作的工具。除非您是Perl,Latex,Emacs或其他重型文本处理团队的成员。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.