【问题标题】:I don’t get regular expressions我没有得到正则表达式
【发布时间】:2009-02-26 11:21:02
【问题描述】:

我不明白或看不出需要正则表达式。

有人可以用简单的术语解释它们,并提供一些可能有用甚至关键的基本示例。

【问题讨论】:

  • @Luca:如果我必须用谷歌搜索某些东西,我通常会这样做:“site:stackoverflow.com 正则表达式”;-)
  • 也许你应该参加法律转换课程之类的。
  • 不用担心得不到正则表达式。我经常忘记如何自己编写正则表达式模式,因为我很少使用它们(当你真正需要它们时这很烦人)。
  • 不要听反对者的意见,也不要担心得不到他们。我也不太明白。另外,由于它们,我已经看到了很多验证错误,我不完全确定它们是一个好主意。对于复杂的验证,我倾向于使用状态机。
  • @seanyboy:正则表达式(一种简洁的表达方式)状态机。它们并不是因为你“没有真正得到它们”而一文不值。事实上,它们非常有用,我为每一种没有提供简洁使用方式的通用语言感到悲哀。

标签: regex


【解决方案1】:

在您需要使用/操作模式的地方使用它们。例如,假设您需要识别以下模式:

  • 任何字母,A-Z,大写或小写,5 或 6 次
  • 3 位数
  • 单个字母 a-z(绝对小写)

(邮政编码、信用卡、社会安全号码验证等都会出现这种情况)

用代码编写并不是真的 - 但随着模式变得越来越复杂,它变得越来越难。使用正则表达式,您描述模式(而不是验证它的代码)并让正则表达式引擎为您完成工作。

这里的模式类似于

[A-Za-z]{5,6}[0-9]{3}[a-z]

(也有其他表达方式。)分组结构可以很容易地匹配整个模式并抓取(或替换)它的不同部分。

虽然有一些缺点:

  • 正则表达式会变得复杂且难以快速阅读。彻底记录!
  • 不同正则表达式引擎之间的行为存在差异
  • 如果您不是专家(我当然不是!),则很难判断其复杂性;有一些“陷阱”可以使模式对特定输入非常慢,这些陷阱根本不明显
  • 有些人大量过度使用正则表达式(当然有些人使用不足)。我见过的最糟糕的例子是有人问(在 C# 组中)如何检查字符串的长度是否为 3 - 这显然是使用 String.Length 的工作,但有人认真建议匹配一个正则表达式。疯狂。 (他们也弄错了正则表达式,这有点证明了这一点。)
  • 正则表达式使用反斜杠来转义各种内容(例如,使用 . 来表示“点”而不仅仅是“任何字符”。在许多语言中,反斜杠本身需要转义。

【讨论】:

  • 另一种用途是我经常使用的文件搜索
【解决方案2】:

正则表达式的用途:

正则表达式本身就是一种允许您对字符串输入执行复杂验证的语言。 IE。你传给它一个字符串,如果匹配与否,它将返回真或假。

如何使用正则表达式:

  • 表单验证,判断用户输入的是不是你想要的格式
  • 在文本块中查找特定模式的位置
  • 搜索和替换搜索词是正则表达式,替换的是普通字符串。

一些正则表达式语言特性:

  • 交替:允许您选择一件事或另一件事。示例仅匹配是或否。

    是|不是

  • 分组:您可以使用括号定义范围和优先级。例如匹配 3 种色调。

    gr(a|e)y|黑色|白色

  • 量化:你可以量化你想要多少东西。 ?表示 1 或 0,* 表示 0 或更多。 + 表示至少一个。示例:接受一个不为空的二进制字符串:

    (0|1)+

为什么是正则表达式?

正则表达式使匹配字符串变得容易,它通常可以用一个简单的小正则表达式字符串替换几十行源代码。

不适用于所有类型的匹配:

要了解某事如何有用,您还应该了解它如何无用。正则表达式不适合某些任务,例如当您需要保证字符串具有相同数量的括号时。

几乎支持所有语言:

正则表达式几乎适用于任何编程语言。

正式语言:

任何正则表达式都可以转换为确定性有限状态机。并且以同样的方式,您可以弄清楚如何制作将验证您的正则表达式的源代码。

示例:

[hc]+at 

匹配“hat”、“cat”、“hhat”、“chat”、“hcat”、“ccchat”等,但不匹配“at”

Source, further reading

【讨论】:

    【解决方案3】:

    它们看起来有点神秘,但它们提供了一个非常强大的工具来查找文本中的模式。从 HTML 页面中的 href 标记到验证电子邮件地址的任何内容。

    它们可以被处理成非常高效的数据结构 (FSA),可以非常快速地找到匹配项。

    【讨论】:

      【解决方案4】:

      它们有点棘手,但非常强大,值得学习。网络上到处都是教程和示例,例如从here 开始,然后查看示例here

      【讨论】:

        【解决方案5】:

        如果我可以将 OP 引导到我自己的一个问题的一些答案/cmets:How important is knowing Regexs?

        【讨论】:

          【解决方案6】:

          正则表达式是指定大多数模式匹配和替换问题的一种非常简洁的方法,并且正则表达式引擎可以进行高度优化。

          如果您想完成与相对简单的正则表达式相同的工作,则必须编写大量代码,其中可能包含许多错误、难以理解且性能不佳。

          虽然用正则表达式做同样的事情要短得多,但几乎可以肯定其性能与技术上可能的一样好,并且对于任何熟悉正则表达式的人来说都更容易理解(尽管在任何一种情况下都应该注释掉)

          【讨论】:

            【解决方案7】:

            电子邮件示例实际上是正则表达式的一个坏示例。可以使用正则表达式,但生成的表达式(例如 this one 不处理“John Doe”样式地址)非常复杂 - 看看 email address specification 你就会明白为什么......

            然而,正则表达式在许多其他情况下非常有用,例如从文本中提取 IP 地址、从 html 中提取标签等。查找所有版本化文件将是另一个示例。类似的东西:

            my_versioned_file_(\d{4}-\d{2}-\d{2}).txt
            

            将匹配my_versioned_file_2009-02-26.txt 格式的任何文件名,并将日期提取为捕获的组(包裹在“()”中的部分)供您进一步分析。

            没有正则表达式不是必需的,但它们可以节省大量时间来编写手动解析器,以实现正则表达式可以轻松实现的目标。

            【讨论】:

              【解决方案8】:

              每当您在大量文本数据中找到某种模式时,或者如果您想检查字符串是否采用某种格式。

              例如一个电子邮件地址...

              用于检查 at 符号和是否存在有效域的代码看起来很大,您可以使用正则表达式并在 2 行代码中得到答案。

              Regex r = new Regex("<An Email Address Regex>");
              bool isValidEmail = r.IsMatch(MyInput);
              

              其他示例包括在将数字解析为整数等之前检查数字的格式是否正确。

              【讨论】:

              • 不是最好的例子,因为验证电子邮件地址的严格正确的正则表达式绝对是巨大的:ex-parrot.com/~pdw/Mail-RFC822-Address.html
              • 这是一个疯狂的正则表达式。我宁愿让人们使用无效的电子邮件地址也不愿使用那个。
              • 这是一个愚蠢的论点。正则表达式代码将起作用,它是一个无法维护的正则表达式的混乱并不重要,因为您可以对它进行单元测试。这是一个已解决的问题。你自己的代码几乎肯定会错过一个极端情况。
              【解决方案9】:

              Jon 和 Sqook 对正则表达式给出了很好的解释和定义,对于简单的问题是可以理解的,但是如果你用它来解决复杂的问题,正则表达式可以是 &$@( (至少对我来说;-))

              我经常使用 Expresso 来帮助我构建复杂的正则表达式代码。

              http://www.ultrapico.com/Expresso.htm

              它有一个内置库,其中包含您可以使用的表达式、一个可以构建代码的设计模式以及一个可以测试和验证代码的测试模式。它帮助我更好地构建和理解复杂的表达式!

              祝你好运!

              【讨论】:

                【解决方案10】:

                一些实际的现实世界用法:

                查找扩展 JUnit 的 TestCase 的抽象类:

                abstract\s+class\s+\w+\s+extends\s+TestCase
                

                这对于查找无法实例化并且需要从运行测试用例的 ant 构建脚本中排除的测试用例很有用。您无法搜索常规文本,因为您事先不知道类名。因此 \w+ (至少一个单词字符)。

                查找正在运行的 bash 或 bourne shell 脚本:

                 ps -e | grep -e " sh| bash"
                

                如果您想将它们全部或其他东西全部杀死,这很有用,如果您只搜索 sh 您不会得到 bash 并且必须再次运行该命令以获取 bash 脚本。同样,比完美更有用,但几乎没有你在运行中编写的正则表达式。

                它并不完美,但大多数正则表达式不会,否则它们会花费很长时间来编写它们不值得。你完善的那些是你作为某种验证或构建应用程序的一部分提交的那些。

                【讨论】:

                  【解决方案11】:

                  关键用途的示例是 JavaScript
                  如果您需要对字符串执行searchreplace,则唯一可以匹配的就是正则表达式。它在那些字符串方法的 JavaScript API 中......

                  就我个人而言,我主要只在需要在文本编辑器(TextPad 或 Visual Studio)中进行一些自动查找/替换的高级匹配时才使用正则表达式。在我看来,最强大的功能是能够匹配可以插入替换的模式。

                  【讨论】:

                    【解决方案12】:

                    举几个例子:

                    • 电子邮件地址

                    • 密码至少需要 1 个字母和 1 个数字

                    • 您如何达到这些要求?

                    • 最好的方法是使用正则表达式。

                    阅读以下链接了解更多信息:

                    如何:在 ASP.NET 中使用正则表达式来约束输入 http://msdn.microsoft.com/en-us/library/ms998267.aspx

                    【讨论】:

                      猜你喜欢
                      • 2021-11-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-07-26
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-06-21
                      相关资源
                      最近更新 更多