40

正则表达式是编程必须的吗?

4

32 回答 32

88

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

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

这段代码很简单,但如果你不知道 RegEx,那么第一个参数中的内容也可能是火星语言。一旦你学习了基础知识,这里使用的 RegEx 实际上非常简单,为了让你更深入地访问 http://www.regular-expressions.info/他们有很多关于 RegEx 的信息及其对不同的各种暗示平台/语言,他们也有一个很好的入门教程。之后查看RegexBuddy,它可以帮助您构建 RegEx,当您构建它们时,如果您观察它的作用,那么它可以帮助您精益求精,这是迄今为止我花过的最好的 39.95 美元。



原创漫画

于 2009-05-20T09:55:36.137 回答
45

是的。你可以不用它们来管理,但你真的应该至少学习一些基础知识,因为大多数计算任务都可以使用它们。从长远来看,您将省去很多痛苦和麻烦。一旦你克服了最初的“wtf”阶段,正则表达式比你想象的要容易得多。

于 2009-05-20T09:51:56.347 回答
26

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

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

于 2009-05-20T09:50:20.360 回答
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;
于 2009-05-20T09:53:46.110 回答
10

这么说吧,如果你的工具包里有正则表达式,你会为自己节省很多时间和精力。如果你没有它们,你将不知道你错过了什么,所以你仍然会很开心。

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

编辑:我意识到通过查看stackoverflow上的正则表达式标签,它可能会帮助您了解一些使用正则表达式的常见问题。

于 2009-05-20T11:23:17.693 回答
7

我会说是的。

它们是如此普遍有用,以至于完全没有能力至少读写简单的东西是一个相当大的障碍。

支持正则表达式的语言

  • 爪哇
  • perl
  • Python
  • PHP 。
  • C#
  • Visual Basic.NET
  • ASP
  • 电源外壳
  • javascript
  • 红宝石
  • tcl
  • 脚本
  • VB6
  • XQuery
  • XPath
  • XSD
  • MySQL
  • 甲骨文
  • PostgreSQL

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

  • 智能
  • 网豆
  • 凝胶
  • 视觉工作室
  • 超编辑
  • 编辑
  • 编辑
  • 记事本++
  • 编辑板临
  • emacs
  • HAP编辑
  • 平板电脑

让我们不要忘记grepsed

作为雇主,你更愿意拥有一个优秀的程序员——偶尔——必须在数千个源文件中手动查找/替换一组相似的字符串,并且需要数小时或数天才能完成,或者是一个优秀的程序员那——偶尔——花五分钟,甚至十分钟来制作一个正则表达式来完成与他们去喝咖啡所花费的时间相同的事情?

这个答案中的真实世界实际用法

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

于 2009-05-21T20:04:10.007 回答
5

不。你可以编程多年而不接触正则表达式。当然,这意味着对于某些了解 RE:s 的人会使用它们的情况,您会做其他事情。解决特定问题总是有不止一种方法,而正则表达式只是表达模式的一种方法(一种非常有效的,因此可能是流行的方法)。

于 2009-05-20T09:51:35.350 回答
4

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

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

于 2009-05-20T11:13:16.403 回答
3

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

于 2009-05-20T09:53:44.143 回答
3

Jeffrey Friedl 写了一本很棒的书,叫做Mastering Regular Expressions。它给了我洞察力,读起来真的很开心。

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

  • 输入:一些 CSV 字典文件,具有某种松散的格式、多种翻译、谚语等。

  • 输出:漂亮的 JSON。

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

  • 第一次尝试:写了一个语法,但有一些粗糙的边缘,主要是特殊情况,仅出现在 0-1% 的数据中。制作一个涵盖所有内容的语法将是过多的设计。

  • 第二次尝试:我使用了一个简单的语法来捕获主要字段,然后将其余部分传递给一个例程,该例程应用了一些正则表达式。它速度快,概念上比完整的语法更容易,而且写起来也很有趣。

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

它们值得学习吗?是的。

必须的?不,但我知道该领域几乎没有人不熟悉它们。

难学?一点也不。

于 2009-05-25T19:13:29.117 回答
2

一句话,不。

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

于 2009-05-20T09:51:43.523 回答
2

其实,我的感觉是,这是必须的.​​..

例如,我正在查看为什么我们的 YouTube 视频的一部分不起作用……结果发现这些视频的链接是

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

代替

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

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

所以在我看来,正则表达式非常重要,没有它,隐藏的错误可能会比平时更频繁地被引入。

但其实我之前遇到过3个开发者,一个是非常优秀的Web应用开发者,一个是硅谷名牌大学的理学硕士,一个是高知名度的硕士研究生,结果他们都没有。”不知道正则表达式。这让我有点吃惊。

于 2009-05-20T09:54:36.263 回答
2

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

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

作为程序员,有很多值得了解/学习的东西,但我敢说正则表达式远非该列表的顶部。

于 2009-05-20T09:54:37.340 回答
1

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

于 2009-05-20T09:53:24.177 回答
1

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

于 2009-05-20T09:53:58.857 回答
1

我想这不是必须的,但它们会减轻您的生活并为您节省很多时间。

如果你不知道如何使用正则表达式,你就不知道你错过了什么。但是仅仅看着一个人使用它们来完成一项任务,就会让你觉得这是你绝对应该拥有的技能。

于 2009-05-20T10:26:46.810 回答
1

如果不使用,正则表达式至少对学习很重要。

首先,你必须能够阅读和理解别人的正则表达式代码。

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

其实女生有备忘单裙

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

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

于 2009-05-20T14:10:33.643 回答
1

不……是的,

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

于 2009-05-20T14:51:02.983 回答
1

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

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

于 2009-05-20T20:37:46.950 回答
1

不,对于合适的要求,您总是有另外两种选择。

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

  2. 在 SO 上发布问题。

于 2009-05-29T03:36:57.613 回答
0

根据您的领域,某些问题适合正则表达式 - 或者相反:使用正则表达式的解决方案 /not/ 非常笨拙。想到电子邮件验证/网址验证/最低密码强度/日期解析。

于 2009-05-20T09:52:42.790 回答
0

一定不是。尽管有人认为一个好的程序员应该知道这一点,但我不会这么说。当时机成熟并且您需要它时,您只需使用它。无论如何,给它六个月不使用它,您将不会记得任何表达选项。

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

于 2009-05-20T09:53:30.540 回答
0

不。

根据您要实现的目标,Regex 可能很有用。但我敢说 80% 或更多的程序员从不使用 Regex,大约 15% 只是偶尔使用(并且必须用 Google 搜索),而其余的只有一小部分实际上吃过 Regex Ninjas。

我发现Regexr非常适合我使用 Regex 的罕见场合。

此外,有人会在接下来的一分钟左右提到 jwz 的某句话……

于 2009-05-20T09:54:09.277 回答
0

正则表达式是一种强大的模式匹配语言。它不仅限于文本字符串。但一如既往,你的代码,你的电话。

于 2009-05-20T10:26:46.870 回答
0

简单地说,没有。这完全取决于您的计划要实现的目标。

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

于 2009-05-20T10:39:07.173 回答
0

我同意其他人的观点,这可能不是必须的,但至少有一个基本的了解是非常有帮助的。我在我的多维数据集中张贴了一张 RegEx 备忘单,我觉得它很有帮助。http://regexlib.com/CheatSheet.aspx

于 2009-05-20T11:37:36.667 回答
0

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

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

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

于 2009-05-20T12:01:04.030 回答
0

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

我想说 - 只需阅读基础知识,这样您就知道 RegEx 是什么以及您可以使用它们做什么,然后如果您发现它们可能有用,您可以获取一个教程/参考网站,例如http://www.regular -expressions.info/并直接进入。

于 2009-05-20T12:02:27.147 回答
0

如果您正在开发一种新产品,我建议您避免使用它们,或者最多谨慎而明智地使用它们。

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

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

于 2009-05-20T12:14:46.217 回答
0

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

于 2009-05-20T12:34:01.763 回答
0

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

于 2009-05-25T19:20:36.873 回答
0

我认为这取决于你要做什么。它们是 mod_rewrite 的必需品。但在大多数情况下,我同意你可以在没有它们的情况下四处走动。但是它们可以为您节省大量时间来完成一些原本会花费大量繁琐时间的任务。

于 2009-12-22T18:12:47.763 回答