开始使用正则表达式 [关闭]

Posted

技术标签:

【中文标题】开始使用正则表达式 [关闭]【英文标题】:get started with regular expression [closed] 【发布时间】:2011-05-13 05:39:37 【问题描述】:

每当我看到任何正则表达式时,我总是害怕。我觉得很难理解。但恐惧不是解决办法。我决定开始学习正则表达式,有人可以告诉我如何开始吗?如果有任何简单的教程?

【问题讨论】:

访问regexlib.com regexpal.com - 你可以在那里练习:)(并注意右侧的快速参考) 编写正则表达式很容易。它只是试图阅读它们...... ;) @tchrist,你看到我声明末尾的';)'了吗。这意味着我在开玩笑。 @nate,好的。我只是对任何语言本质上都是不可读的概念很敏感。语言不会编写只写代码;人们这样做。 :( 【参考方案1】:

http://www.gskinner.com/RegExr/ 以在线版本和 AIR 应用程序的形式存在。

这款应用的酷炫之处在于(除了它的魅力之外),您可以直接通过该应用保存您的表情或与社区分享。

假设您需要一个电子邮件正则表达式,您只需搜索电子邮件,您就会得到一个已评级的表达式列表。

另一个有用的功能是将您的表达解释为人类可读的形式。这样更容易学习和掌握。

对于教程部分this article 非常容易使用。

【讨论】:

【参考方案2】:

regular-expressions.info 是有关正则表达式的信息和教程的金矿。从初学者到专家,在正则表达式的研究方面,没有比这个网站更好的了。

【讨论】:

【参考方案3】:

☝ /Regexes/ 入门

正则表达式是声明式编程的一种形式。如果您习惯于命令式、函数式或面向对象的编程,那么它们是一种非常不同的思维方式。这是一种基于规则的方法,具有微妙的回溯问题。我敢说 Prolog 的背景实际上可能对你有好处,这当然不是我通常建议的。

通常我会让人们在他们的 shell 中使用grep 命令,然后继续使用正则表达式在他们的编辑器中进行搜索和替换。

但我猜你不是来自 Unix 背景,因为如果你是,你会遇到各种正则表达式,从最基本的grep 命令到vi 中的模式匹配或emacs 编辑。您可以通过键入

查看grep 联机帮助页
% man grep

在您的BSD 上, Linux, Apple 或 Sun 系统 - 仅举几例。

                          ☹ ¡ʇɟoƨoɹɔᴉƜ ʇnoqɐ əɯ ʞƨɐ ʇ ̦uop əƨɐəld ʇƨnɾ


☟ (?: Book Learnin'?)

如果您在学校或大学遇到过常规表达,那可能是在自动机理论的背景下。他们在讨论regular languages 时出现。如果您曾经历过此类课程,您可能还记得正则表达式是用户友好的面孔,以应对混乱的有限自动机。然而,他们可能没有教你的是,在象牙塔之外,人们在现实世界中实际使用的正则表达式远远落后于稀有、理论、以及对那个平常词的高度不规则意义。这意味着现代正则表达式——如果你愿意,可以称之为模式——可以比传统的正则表达式做更多的事情 计算机科学课程中教授的表达式。在课堂之外的现代正则表达式中已经没有任何 REGULAR 了,但这是一件好事。

我说的是“现代”,但实际上正则表达式自从 Ken Thompson 首次将引用放回他的回溯 NFA 时就不再是正则表达式,那是他著名的证明 NFA-DFA 等价的时候。因此,除非您实际上使用的是 DFA 引擎,否则最好忘记任何关于正则表达式的正规性的书本学习废话。它只是不适用于我们在现实世界中每天真正使用它们的方式。

现代正则表达式允许的不仅仅是反向引用,一旦你深入研究它们就会发现。他们是他们自己的美妙世界,即使那个世界有时有点超现实。它们可以让您在一行中替换一页又一页的代码。他们还可以让你因为他们的疯狂行为而脱发。有时它们会让你的计算机看起来像是挂了,因为它实际上在努力工作,在一些糟糕的 O(2ⁿ) 算法甚至更糟的情况下,在它和宇宙的热死之间进行竞赛。实际上,情况很容易变得更糟。这就是拥有这种权力在你手中所能做的。没有训练轮或慢车道。正则表达式是一种强大的工具非常出色


/☕✷⅋⋙$⚣™‹ª∞¶⌘̤℈⁑‽#♬˘$π❧/

⁠ ⁠ ⁠

在我给你一大堆有用的参考资料之前,还有一件事。就像我 already said today elsewhere 一样,正则表达式不一定要难看,也不一定要难。 记住:如果你创建了丑陋的正则表达式,那只是的反映,而不是他们的反映。

这绝对是创建难以阅读的正则表达式的借口。哦,那里有很多这样的东西,但它们不应该也不需要。尽管正则表达式(在大多数情况下是一种声明式编程形式,但在其他形式的编程中使用的所有软件工程技术 ̲s̲t̲i̲l̲l̲ ̲a̲p̲p̲l̲y̲ ̲h̲e̲r̲e̲!

正则表达式绝不应该看起来像一排密密麻麻的无法破译的标点符号。如果您删除所有字母标识符、删除所有空格和缩进、删除所有 cmets 并删除所有自上而下编程的最后痕迹,任何语言都将是一场灾难。因此,如果您这样做,它们当然看起来像 cr@p。不要这样做

所以使用所有这些基本工具,包括美观的代码布局、仔细的问题分解、命名子例程、将声明与执行分离(包括排序!)、单元测试以及所有其他,每当您创建正则表达式时。这些都是making your patterns maintainable 中的关键步骤。

/(.)\1/ 是一回事,但写像mǁ☕⅋⚣⁑™∞¶⌘℈‽#♬❧ǁ 这样的东西又是另一回事。这些是来自黑暗时代的正则表达式:不要只是拒绝它们:在火刑柱上烧掉它们!毕竟,它是编程,不是线路噪音或高尔夫!


☞ 正则表达式参考

    关于正则表达式的Wikipedia page 是一个足够好的概述。

    IBM 在其 Speaking Unix 系列中有一个nice introduction 用于正则表达式。

    Russ Cox 有一个很好的classic regular expressions references 列表。您可能想查看原始的 Version 8 regular expressions,在 Perl 联机帮助页中可以找到,但这些是过去每个人长大的原始、最基本的模式。

    Mastering Regular Expressions 来自 O'Reilly,作者 Jeffrey Friedl。

    Jan Goyvaerts’s regular-expressions.info site 和他的 Regular Expression Cookbook,同样来自 O'Reilly。

    我是 Perl 的母语人士,所以让我说四句话。 Perl Cookbook 的第 5 章和 Programming Perl 的第 6 章,有点尴尬的是 yours truly et alios,同样来自 O'Reilly,专门讨论 Perl 中的正则表达式。 Perl 是现代正则表达式中大多数正则表达式功能的起源语言,并且它继续处于领先地位。 Perl 对正则表达式的 Unicode 支持特别丰富,而且使用起来非常简单——与其他语言相比。您可以从 O'Reilly 站点下载这两本书中的所有代码示例,或查看下一项。 perldoc.org site 有很多关于模式匹配的内容,包括 perlre 和 perluniprops 联机帮助页,只是作为几个起点。

    根据 Perl Cookbook,PLEAC 项目以令人眼花缭乱的多种语言重新实现了 Perl Cookbook 代码,包括 ada、common lisp、 groovy、guile、haskell、java、merd、ocaml、php、pike、python、rexx、ruby 和 tcl。如果您查看每种语言对应于 PCB 的正则表达式章节所做的工作,您将了解 大量该语言如何处理正则表达式。这是一个了不起的资源,令人大开眼界,即使某些解决方案是,嗯,不理想。

    Java Regular Expressions 来自 Apress 的 Mehran Habibi。这肯定比通过阅读Sun’s documentation on the Pattern class 来弄清楚任何事情要好。 Java 可能是学习正则表达式的最糟糕的语言;它非常笨拙,而且常常完全愚蠢。我是从痛苦的个人经历中说出来的,而不是出于无知,在这次评估中I am hardly alone。如果你必须使用 JVM 语言,我推荐Groovy 或者Scala。不幸的是,两者都基于标准的 Java 模式匹配类,因此请分享它们的不足之处。

    如果您需要 Unicode 并且使用 Java 或 C⁺⁺ 而不是 Perl,那么我建议您查看 ICU library。他们在 Java 中处理 Unicode 比 Sun 好得多,但在我看来,它仍然太像汇编程序。 Perl 和 Java 似乎对 Unicode 和多种编码有最好的支持。 Java 仍然有点毛病,但其他语言的情况往往更糟。请注意,在网站上使用正则表达式的语言总是比没有使用正则表达式的语言更笨拙。

    如果您使用的是 C,那么我可能会跳过 system-supplied regex library 并直接跳到 PCRE by Phil Hazel。一个好处是 PCRE 可以 被构建来相当好地处理 Unicode。它也是其他几种语言和工具(包括 PHP)使用的基本正则表达式库。

【讨论】:

+1:我很想再按九次投票按钮以获得如此全面的答案。 哇,这是我在堆栈溢出中得到的最大答案,非常感谢。你说“记住:如果你创造了丑陋的正则表达式,那只是对你的反映,而不是对他们的反映。” ,我会尽我所能创造简单而漂亮的正则表达式:)【参考方案4】:

在regular-expressions.info 学习时,Regular Expressions Cheat Sheet (V2) 是您绝对想要拥有的东西。

【讨论】:

【参考方案5】:

This book 在我刚开始使用 awk 和 sed 时救了我一命。

【讨论】:

【参考方案6】:

正则表达式本身可能无法实现任何实用程序,除非与使用某种脚本工具(sed/awk)或诸如 Perl 之类的编程语言的文本操作操作相结合。尝试安装Regex Buddy。不错的独立工具,可以让您在某些文件上使用正则表达式。

所以是的,如果我可以这样称呼,您可以了解一些提及它们的结构、语法、语义的基本信息,但请尝试阅读 Perl、Vim 中的正则表达式教程,并做一些示例字符串/文本在这些上下文中以编程方式进行操作

-AD。

【讨论】:

【参考方案7】:

http://www.regular-expressions.info/tutorial.html

【讨论】:

【参考方案8】:

regular-expressions.info有很好的教程here

【讨论】:

以上是关于开始使用正则表达式 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何用星号分割值并使用正则表达式获取第一个数字[关闭]

正则表达式。如何从xml文档中提取值[关闭]

为啥正则表达式如此有争议? [关闭]

友好的 URL htaccess 重写规则正则表达式 [关闭]

正则表达式

密码策略的正则表达式 [关闭]