【问题标题】:^ and $ expressed in fundamental operations in regular expressions^ 和 $ 用正则表达式的基本运算表示
【发布时间】:2019-05-31 07:32:40
【问题描述】:

我读过一本书,其中指出正则表达式中的所有基本操作都是concatatenationor(|)closure(*)parenthesis 以覆盖默认优先级。其他所有操作只是一个或多个基本操作的捷径。

例如,(AB)+ 快捷方式扩展为(AB)(AB)*(AB)? 扩展为(ε | AB),其中ε 是空字符串。首先,我查找了 ASCII 表,我不确定哪个字符码被指定为空字符串。是ASCII 0吗?

我想弄清楚如何在基本操作中表达^$ 的快捷方式,如^ABAB$ 表达式,但我不知道该怎么做。你能帮我弄清楚这在基本面中是如何表达的吗?

【问题讨论】:

标签: regex


【解决方案1】:

正则表达式,它们在数学中的定义方式,实际上是字符串生成器,而不是搜索模式。它们用作特定类别的字符串集的方便表示法。 (这些集合可以包含无限数量的字符串,因此枚举所有元素是不切实际的。)

在编程环境中,正则表达式通常用作灵活的搜索模式。用数学术语来说,“找到目标字符串 S 的子字符串,它是由正则表达式 R 生成的集合中的一个元素”。这个子字符串搜索不是正则表达式的一部分;就像实际的正则表达式引擎周围有一个循环,它试图将每个可能的子字符串与正则表达式匹配(并在找到匹配项时停止)。

在基本的正则表达式术语中,就像在您的模式前后添加了一个隐含的.*。当你这样看时,^$ 只是防止 .* 被添加到正则表达式的开头/结尾。

顺便说一句,正则表达式(通常在编程中使用)实际上并不是数学意义上的“常规”;即有许多构造不能转换为上面列出的基本操作。这些包括反向引用(\1\2、...)、字边界(\b\<\>)、前瞻/后瞻断言((?= )(?! )(?<= )(?<! )) 等。

至于ε:它没有字符代码,因为空字符串是字符串,不是字符。具体来说,字符串是一个字符序列,空字符串不包含任何字符。

【讨论】:

  • 谢谢。这本书的作者还指出,运行grep StdIn *.java 将打印所有包含StdIn 的行,因为StdIn 被扩展为.*StdIn.*。因此,在这种情况下,. 实际上意味着除换行符之外的所有字符,因此使用它准备每个搜索词应该返回完整的行,而不仅仅是搜索模式。
  • @sanjihan . 的确切含义取决于您使用的正则表达式引擎和选项。在我的回答中,我确实使用. 来表示“每个角色”。对于grep. 是否匹配\n 没有区别,因为grep 匹配的目标字符串是输入文件的单行;即grep 中的目标字符串首先从不包含任何换行符。
  • @melpomene 是否可以使用数学意义上的“常规”语言编写任何断言?
【解决方案2】:

^AB可以表示为(εAB)即空字符串后跟AB,AB$可以表示为(ABε)即AB后跟一个空字符串。

空字符串实际上定义为'',这是一个长度为0的字符串,所以在ASCII表中没有值。然而,C 编程语言以 ASCII NULL 字符终止所有字符串,尽管这不计入字符串长度,但在分配内存时仍然必须考虑它。

编辑 正如@melpomene 在他们的评论中指出的那样,εAB 等同于 AB,这使得上述内容无效。与一所工作学院交谈后,我不再确定如何做到这一点,或者即使它是可能的。希望有人能给出答案。

【讨论】:

  • εAB 等价于AB
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多