正则表达式是否必须用于编程?

时间:2009-05-20 09:48:35

标签: regex string-matching

正则表达式是否必须进行编程?

32 个答案:

答案 0 :(得分:88)

一个人可能很容易没有他们,但有一个人应该(恕我直言)知道基本知识,原因有两个 1)RegEx可能是解决手头问题的最佳解决方案(见下图) 2)当你在别人的代码中看到正则表达式时,它不应该是100%神秘的。

preg_match('/summarycount">.*?([,\d]+)<\/div>.*?Reputation/s', $page, $rep);

这段代码很简单但是如果你不知道RegEx,那么第一个参数中的东西也可能是火星语言。一旦你学习了基础知识,这里使用的RegEx实际上非常简单,并且为了让你远远超过http://www.regular-expressions.info/,他们有很多关于RegEx的信息及其在不同平台/ langauges上的各种意义他们也有开始的好教程。在检查RegexBuddy之后,它可以帮助您构建RegExs,当您构建它们时,如果您观察它的功能,那么它可以帮助您精益,它到目前为止是我用过的最好的39.95美元。



Original Comic

答案 1 :(得分:45)

是。您可以在没有它们的情况下进行管理,但您至少应该学习基础知识,因为大多数计算任务都可以使用它们。从长远来看,你将节省很多痛苦和麻烦。一旦你超越了最初的'wtf'阶段,正则表达式就比你想象的容易得多。

答案 2 :(得分:26)

我会说不,他们不是必须的。你可以在不了解它们的情况下成为一名优秀的程序员。

我发现我使用正则表达式主要用于数据操作的一次性任务,而不是实际放入应用程序代码。它们可以方便地验证输入数据,但是现在你的控件通常会为你做这件事。

答案 3 :(得分:17)

完全没有。如果没有它们,你可以用正则表达式做任何事情。

然而,它是一个功能强大的模式匹配系统,因此使用简单的正则表达式模式很容易实现的一些事情需要很多代码才能完成。

例如,这个:

s = Regex.Replace(s, "[bcdfghjklmnpqrstvwxz]", "$1o$1");

在没有正则表达式的情况下需要更多代码:

StringBuilder b = new StringBuilder();
foreach (char c in s) {
   if ("bcdfghjklmnpqrstvwxz".IndexOf(c) != -1) {
      b.Append(c).Append('o').Append(c);
   } else {
      b.Append(c);
   }
}
s = b.ToString();

或者,如果你不是一个经验丰富的程序员,你可以轻松创建更多代码并执行非常糟糕的东西:

string temp = "";
for (int i = 0; i < s.Length; i++ ) {
   if (
      s[i] == 'b' || s[i] == 'c' || s[i] == 'd' ||
      s[i] == 'f' || s[i] == 'g' || s[i] == 'h' ||
      s[i] == 'j' || s[i] == 'k' || s[i] == 'l' ||
      s[i] == 'm' || s[i] == 'n' || s[i] == 'p' ||
      s[i] == 'q' || s[i] == 'r' || s[i] == 's' ||
      s[i] == 't' || s[i] == 'v' || s[i] == 'w' ||
      s[i] == 'x' || s[i] == 'z'
   ) {
      temp += s.Substring(i, 1);
      temp += "o";
      temp += s.Substring(i, 1);
   } else {
      temp += s.Substring(i, 1);
   }
}
s = temp;

答案 4 :(得分:10)

让我这样说吧,如果你的工具包中有正则表达式,你将节省大量的时间和精力。如果你没有它们,你就不会知道你错过了什么,所以你仍然会很开心。

作为Web开发人员,我经常使用它们(输入验证,从站点提取数据等)。

编辑:我意识到通过在stackoverflow上查看 regex tag ,可以帮助您查看正则表达式常见问题。

答案 5 :(得分:7)

我会说是的。

它们是如此普遍有用,完全没有能够至少阅读和阅读的能力是一个非常重要的障碍。写简单的。

支持正则表达式的语言

  • Java
  • perl
  • python
  • PHP。
  • C#
  • Visual Basic.NET
  • ASP
  • powershell
  • javascript
  • ruby​​
  • tcl
  • vbscript
  • VB6
  • XQuery
  • XPath
  • XSDs
  • MySQL
  • Oracle
  • PostgreSQL

支持正则表达式的IDE和编辑器

  • 的Eclipse
  • 的IntelliJ
  • Netbeans的
  • 凝胶
  • Visual Studio
  • 的UltraEdit
  • JEDIT
  • n编辑
  • 记事本++
  • Editpad Pro
  • emacs的
  • HAPEdit
  • PSPad

让我们不要忘记grepsed

作为一个雇主,你宁愿拥有,一个优秀的程序员 - 曾经偶尔 - 将不得不在数千个源文件中手动查找/替换一些类似的字符串,并且需要数小时或数天才能完成,或者一个优秀的程序员 - 曾经偶尔 - 花费五,甚至十分钟制作一个正则表达式,以完成他们去喝咖啡所花费的同样的事情?

本答案中的真实世界实用用法

事实上,我实际上使用正则表达式来制作这篇文章。我最初列出了以逗号分隔的散文支持它的语言。然后我重新思考它并通过搜索表达式(\w+),并将其替换为JEdit中的\n* $1将格式更改为项目符号列表。随着他们获得的经验越多,使用它们对于更短和更短的行动将变得越来越具有成本效益。

答案 6 :(得分:5)

没有。您可以编程多年而无需触及正则表达式。当然,这意味着对于某些知道RE:s的人会使用它们的情况,你会做其他事情。解决特定问题的方法总是不止一种,而正则表达式只是表达模式的一种方式(一种非常有效,也许是受欢迎的方式)。

答案 7 :(得分:4)

如果你关心发展软件工程师的职业,那么是的。我雇用软件工程师,如果他们不知道使用正则表达式的基础知识,或者从未听说过它们,那么我想知道他们在整个编程技术范围内有多少经验。还有什么他们不知道?

上面的大多数评论都说'不,你可以用其他方式解决问题',他们也大多说替代品是更多的代码,需要更长的时间来编写...现在认为可维护性以及这个定制代码的容易程度改变...使用正则表达式 - 然后它只是一行代码。

答案 8 :(得分:3)

至少知道正则表达式存在以及它们可用于什么是绝对必要的。否则,在许多情况下,您将面临重新发明轮子的危险。如果您了解它们的存在,您可以在必须应用它们后进入细节。 顺便说一句,正则表达式背后的理论非常有趣: - )

答案 9 :(得分:3)

Jeffrey Friedl写的一本好书叫Mastering Regular Expressions。它给了我洞察力,是一个真正的阅读乐趣。

即使我不经常使用正则表达式,它们最近派上用场了:

  • 输入:某些CSV字典文件,包含某种宽松格式,多种翻译,语录等。

  • 输出:很好的JSON。

  • 首先想到:写一个简短的语法来解析所有可能的字段和值。

  • 第一次尝试:写了一个语法,但是有一些粗糙的边缘,主要是特殊情况,只发生在0-1%的数据中。制作一个能够捕捉所有语法的语法本来就太过分了。
  • 第二次尝试:我使用一个简单的语法捕获主要字段,然后将其余部分传递给一个例程,该例程应用了一些正则表达式。它的速度快,概念上比完整的语法更容易,而且编写也很有趣。

  • 摘要:正则表达式节省了我几个小时,实际上帮助我查看数据中的特殊情况以及它们出现的方式和位置。

他们值得学习吗?是的。

必须吗?不,但我知道几乎没有人不熟悉他们。

难学?完全没有。

答案 10 :(得分:2)

实际上,我觉得这是必须的.​​.....

例如,我正在查看为什么我们的YouTube视频的一部分无法正常工作......结果发现这些视频的链接

http://ca.youtube.com/v/raINk2Ii1A4(不是实际网址,仅作为示例)

而不是

http://www.youtube.com/v/raINk2Ii1A4

另一位程序员早先使用“substr()”来提取youtube视频ID,而且由于ca.youtube.com部分,ID被提取错误。

所以根据我的感觉,正则表达式非常重要,没有它,隐藏的错误可以比平时更频繁地引入。

但我之前遇到过3位开发人员,其中一位是非常优秀的网络应用程序 开发人员,其中一人来自着名的Master of Science degree顶级大学Silicon Valley,其中一人是高调的大师级毕业生,结果发现他们都不知道正则表达式。这对我来说有点意外。

答案 11 :(得分:2)

没有。我自己对正则表达式很糟糕,但我仍然是一个糟糕的程序员。等待。什么?

更严肃的说明:我知道正则表达式,但几乎不需要它们。如果我真的需要一个,例如当我需要像Dave提到的那样验证用户输入时,我问一位同事。

所以有很多东西对于作为程序员来说是有价值的,但是我敢说正则表达式远不在该列表的顶部。

答案 12 :(得分:2)

总之,没有。

但它们当然可以成为正确工作的正确工具,值得学习那些最佳工作的字符串匹配操作。然而,仅仅因为你有一把好的大锤子,并不意味着你应该用它来破解每一个坚果。

答案 13 :(得分:1)

我想这不是必须的,但它们会让你的生活变得轻松,为你节省很多时间。

如果你不知道如何使用正则表达式,你不知道你缺少什么。但只要看一个使用它们来完成一项任务的人就会觉得这是你应该拥有的技能。

答案 14 :(得分:1)

可能不是。但它们非常容易学习。至少基础知识(所有正则表达式引擎所做的事情)很快被教导。我在30分钟内从另一个人的聊天窗口中学到了...

答案 15 :(得分:1)

不,您总是有两个其他选项可以满足合适的要求。

  1. 询问知道正则表达式的朋友。

  2. 将问题发布在SO上。

答案 16 :(得分:1)

那么,在计算机科学理论领域,它是非常强大和有用的“设备”,因为有了它,你就能够定义常规语言并用它来识别NFA甚至DFA,因此证明了计算理论或有限自动化中的一些困难定理。形式语言领域。 在实际编程中它也非常有用,因为使用它你可以以相对简单的方式执行复杂的字符串操作。

答案 17 :(得分:1)

至少在最低级别了解正则表达式/可以做什么是非常重要的。如果您了解背后的概念和NFA,那么您将更好地理解其他问题。

至于开始擅长正则表达式,我认为没有必要但非常有价值。事实是每个正则表达式引擎都是不同的,所以即使你掌握了一个,你也可能无法在其他地方快速完成。

答案 18 :(得分:1)

不......是的,

这非常像其中一个,“我应该学习C”的问题。没有正则表达式永远不一定是做某事的唯一方法。但它们通常是一种有用的抽象,可以简化代码,并且可以(我真的认为)甚至可以使它更具可读性。也许是因为我爱Jeff Friedl's Mastering Regular Expressions或者也许是因为我在perl工作。但无论出于何种原因,正则表达式都是我的工具。现在,使用正则表达式然后大多数其他字符串操作技术似乎更容易。

答案 19 :(得分:1)

正则表达式至少在学习时是否重要。

首先,您必须能够阅读并理解他人的正则表达式代码。

其次,基本正则表达式对应于有限自动机(通过Kleene定理),这使得它们对于算法设计至关重要。

实际上,女孩有一个备忘单裙子

http://store.xkcd.com/xkcd/#RegexCheatSkirt

如果你碰巧是一个女孩,这可能是一个很棒的学习机会。

答案 20 :(得分:0)

我认为这取决于你将要做什么。它们是mod_rewrite必须的。但在大多数情况下,我同意你可以在没有它们的情况下绕行。但是它们可以为你节省大量时间,而这些任务可能需要花费很多时间。

答案 21 :(得分:0)

如果您进行大量字符串操作,搜索和替换等,则需要它们。

答案 22 :(得分:0)

比说,知道HTML或能够使用关系数据库。严格来说,不,它们不是编程的必要条件 - 它们在某些工作中可能是必不可少的,也是基础的,而在其他工作中则无关紧要。在为新的以太网芯片编写设备驱动程序时,您不太可能使用正则表达式(或HTML或SQL)。在我的区域中,我偶尔会在生产代码中使用正则表达式,更常见的是在特定脚本中按摩报告等。我曾在一个项目中工作,它们是一个核心功能(用于分析自由格式文本的应用程序用于生成编译规则集的某些关键短语。)

答案 23 :(得分:0)

如果你正在开发一种新产品,我会建议你避免使用它们,或者最常用的是谨慎和明智地使用它们。

如果您维护的产品已经使用了正则表达式,那么您别无选择。

它有助于至少能够识别正则表达式,因此如果您遇到特别模糊的代码,您就会知道正确的搜索词来查找参考卡。

答案 24 :(得分:0)

绝对不是,我(像许多人一样)已经编程多年而没有触及它们。 也就是说,一旦你了解它们,你就会开始看到它们在过去可能有用的地方: - )

我会说 - 只是阅读基础知识,以便了解RegExes是什么以及您可以使用它们做什么,然后如果您发现它们可能有用,您可以获取像{{3}这样的教程/参考网站然后跳进去。

答案 25 :(得分:0)

理解正则表达式不是必须的。但是,它是处理文本的有效工具。如果你处理操纵文本的项目,你最终会遇到它们。

正则表达式带来各种挑战,无论您是使用它们还是只支持具有它们的代码。请注意,有各种语法风格。不同的库和语言通常具有略微不同的语法规则。正则表达式,因为它们变得更加复杂,可以很容易地从简单的模式匹配工具转换为一段魔术,只写一些不易理解的代码。而且,与大多数文本处理工具一样,它们通常很难进行故障排除或更改(例如,您的角落不足以适应工具的功能)。

与所有解析代码一样,我建议进行大量的单元测试。特别要注意边缘条件,重复的文本模式和不寻常的输入。

答案 26 :(得分:0)

我同意其他人的说法,这可能不是必须的,但至少要有一个基本的理解是非常有帮助的。我在我的立方体中发布了一个RegEx备忘单,我觉得非常有帮助。http://regexlib.com/CheatSheet.aspx

答案 27 :(得分:0)

简单,不。这一切都取决于你的计划要实现的目标。

当然,了解RegExp是什么以及对它们如何工作的基本了解将来会有用。

答案 28 :(得分:0)

正则表达式是一种功能强大的模式匹配语言。它不仅限于文本字符串。但与往常一样,您的代码,您的电话。

答案 29 :(得分:0)

没有

根据您要实现的目标,Regex非常有用。但是我会冒这样的风险,即80%或更多的程序员从不使用正则表达式,只有15%左右的程序员偶尔使用正则表达式(并且必须使用谷歌),其余只有一小部分人使用Regex Ninjas。

我发现Regexr对于我使用正则表达式的罕见情况非常有用。

另外,有人会在接下来的一分钟内提到jwz的某个引用......

答案 30 :(得分:0)

一定不是。虽然有一个好的程序员应该知道它,但我不会这么说。到时候你需要它,你就可以使用它了。无论如何,给它六个月不使用它,你将不记得任何表达选项。

就像编程中的所有事实一样,你学习它,你忘了它,你重新学习它。

答案 31 :(得分:0)

根据你的领域,某些问题适合正则表达式 - 或者反过来说:解决方案/不使用正则表达式是非常笨拙的。电子邮件验证/网址验证/最小密码强度/日期解析会浮现在脑海中。