gpt4 book ai didi

regex - 什么是正则表达式?

转载 作者:行者123 更新时间:2023-12-03 00:48:44 26 4
gpt4 key购买 nike

我知道这个问题看起来很愚蠢,但事实并非如此。我的意思是到底是什么。我对解析问题有一个很好的理解。我知道 BNF/EBNF,我在我的一门大学类(class)中编写了语法来解析简单的上下文无关语言。我以前只是从未见过正则表达式!我唯一记得的是上下文无关语法可以做正则表达式可以做的所有事情。

另外,对于通常的编码来解析字符串有用吗?一个简单的例子会很有帮助。

最佳答案

正则表达式首先出现在数学和自动机理论中。正则表达式只是定义 regular language 。无需过多讨论“常规”的含义,可以这样考虑语言:

  1. 语言是由字符串组成的。例如,英语是一种语言,它是由字符串组成的。
  2. 这些字符串由符号组成 - 称为字母表。所以字符串只是字母表中符号的串联。

因此,您可能有一个不属于给定语言的字符串(记住,这只是符号的串联)。或者也可以是语言。

假设您有一个由 2 个符号组成的字母表:“0”和“1”。假设您想使用该字母表中的符号创建一种语言。您可以创建以下规则:“为了使字符串采用我的语言,它必须只包含 0 和 1。”

所以这些字符串是您的语言:

  • 0
  • 1
  • 01
  • 11001101
  • ...等等

这些内容不会是您的语言:

  • 2
  • 桃子
  • 00101105

这是一种非常简单的语言。怎么样:“在我的语言中,每个字符串[类似于英语中的有效“单词”]必须带有 0,然后后面可以跟任意数量的 0 或 1”

这些语言是:

  • 0111111
  • 0000000
  • 0101010110001

这些不是:

  • 1
  • 10000
  • 1010
  • 2000000

与其使用单词来定义语言,而且这些语言可能会变得非常复杂(“1 后跟 2 个 0,后跟 1 和 0 的任意组合,以 1 结尾”),我们提出了这种称为“常规”的语法表达式”来定义语言。

第一种语言是:

(0|1)*

(0或1,无限重复)

下一个:0(0|1)*

(0,后跟任意数量的 0 和 1)。

现在让我们考虑一下编程。当您创建正则表达式时,您是在说“查看此文本。返回与模式匹配的字符串。”这实际上是在说“我已经定义了一种语言。将本文档中使用我的语言的所有字符串返回给我。”

因此,当您创建“正则表达式”时,您实际上是在定义正则语言,这是一个数学概念。 (实际上,类似 perl 的正则表达式定义了“非正则”语言,但这是一个单独的问题。)

通过学习正则表达式的语法,您正在学习如何创建一种语言的细节,以便稍后您可以查看给定的字符串是否在该语言中。因此,人们通常说正则表达式用于模式匹配 - 这基本上就是您在查看模式时所做的事情,并查看它是否“匹配”您的语言的规则。

(这很长。它能回答你的问题吗?)

关于regex - 什么是正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1085404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com