为什么在正则表达式中没有排列?(即使普通语言似乎能够做到这一点)


13

问题

没有简单的方法来获取正则表达式的排列。

  • 排列:单词 (“ aabc”)转换为另一个顺序,而无需更改数字或字母种类。
    w=X1个Xñ
  • 正则表达式:正则表达式。

进行验证:

我正在寻找的解决方案

它应具有以下形式:

  • »aabc«(或其他任何可以使用左括号和右括号的内容)
  • (aabc)!(类似于(abc)?,但最后还有另一个符号)
  • [aabc]!(类似于[abc] +,但最后还有另一个符号)

这些解决方案的优势

他们是:

  • 简单
  • 适应性强
  • 可重用

为什么这应该存在

  • 正则表达式是描述常规语言语法的一种方式。他们完全有能力成为任何一种常规语言。
  • 假设常规语言功能强大,可以进行排列(下面有证明)–为什么没有简单的方法来表达这一点?

所以我的问题是:

  • (为什么)我的证明错了吗?
  • 如果正确:为什么没有简单的方法来表达排列?

证据

  • 正则表达式是记录正则语言语法的一种方法。他们可以描述任何常规语言的语法。
  • 描述任何常规语言(字母表中字母数量有限)的另一种语法是非确定性自动机(状态数量有限)。

具有有限数量的字母,我可以创建此自动机:(示例。正式形式:请参见下文)

接受“ abbc”排列的语法:

(很抱歉上面的数字,也许有人知道如何使这部分看起来更好)

s->ah¹

s->bh²

s->ch³

h¹->bh¹¹

h¹->ch¹²

h²->ah¹¹(没有错字!等价)

h²->bh²²

h²->ch²³

h³->ah¹²

h³->bh²³

h¹¹-> bc

h¹¹-> cb

h²²-> bb

h²²->交流

h²²-> ca

h²³-> ab

h²³-> ba

更正式:(使用有限状态自动机,但是也可以用语法来完成)

  • 单词q(具有有限的长度),任何排列都应达到接受状态。
  • X是有限字母。
  • 状态集S包含不超过q长度的任何字母顺序。(因此,S的大小是有限的。)加上“任意字”的一种状态。
  • 状态转换函数d,它接收一个字母并在与该单词的当前读取部分相对应的状态上移动。
  • F是状态的集合,是q的精确置换。

因此可以创建一个有限状态自动机来接受给定单词的排列。

继续证明

因此,我证明了常规语言可以检查排列,不是吗?

那么,为什么没有办法用Regexes达到这一目的呢?这是一个有用的功能。


10
您可以使用正则表达式列出单词的所有排列。生成的表达式将很大,但肯定是正则表达式。
Yuval Filmus

7
我建议忽略有关堆栈溢出的计算理论的所有答案。这不是该网站的特色。
Yuval Filmus

-您的链接页面在这里的答案stackoverflow.com/a/3102205/6936386 -似乎是很容易适应,而不是太复杂:^(a()|a()|b()|c()){4}\2\3\4\5$似乎工作(见regex101.com/r/9URPpg/4/tests)。
boboquack

7
@boboquack在计算机科学中使用该术语时,这不是一个正则表达式。(这正是Yuval建议不信任有关理论CS的Stack Overflow答案的原因。)
David Richerby

Answers:


37

形式语言理论的基本定理是正则表达式,正则语法,确定性有限自动机(DFA)和非确定性有限自动机(NFA)都描述相同的语言:即规则语言。我们可以用多种完全不同的方式描述这些语言的事实表明,这些语言具有某种自然而重要的意义,就像图灵机,lambda微积分和所有其他事物的等效性一样,暗示了可计算语言是自然而重要的。它们不仅仅是原始发现者做出的任何随机决定的产物。

假设我们添加了一条用于创建正则表达式的新规则:如果  为正则表达式,则为正则表达式,并且它匹配与匹配的每个字符串的每个排列  。因此,例如,。问题在于,这破坏了上述基本等同性。 是含有相同数量的字符串的语言 S和 S和这不是一个普通的语言。对此进行比较,例如,向正则表达式中添加否定或反转运算符,这不会改变所接受语言的类别。[Rπ[R[R大号π一个bC={一个bC一个Cbb一个CbC一个C一个bCb一个}大号π一个b一个b

因此,为了回答标题问题,正则表达式不能进行置换,并且我们不添加该功能,因为正则表达式将不匹配正则语言。话虽如此,“带有置换的正则表达式”也可能是有趣的一类具有许多不同特征的语言。


但是L((ab)*)也不是常规语言,因此L(perm((ab)*))也不能是一种。((ab)*不是常规语言,因为没有任何记忆可以记住打开的“ a”有多少个,因此在有限数量的状态下,您不能放置相同数量的“ b”。)
Asqiir

9
@Asqiir是正则的,因为它是给定正则表达式匹配的语言。您似乎误解了语言是什么。是,而不是。后一种语言不是常规语言,但这不是我们正在谈论的语言。{ ε a b a b a b a b a b a b a b a b a b a b a } { ε a b a a b b a a a b b b a a a a b b大号一个b{ε,ab,abab,ababab,abababab,}{ε,ab,aabb,aaabbb,aaaabbbb,}
David Richerby

4
@Asqiir它是语言,因为它是你应用你想要的任何排列,其中每个字符串包含相同数量的语言得到了什么 S和 S; 这是不正常的,因为您可以证明使用抽水引理。bab
David Richerby

2
你是完全正确的。我错过了“将正则表达式相互放入”这一点,我只想到了“置换一个固定的单词”而不是“置换另一个正则表达式”,这当然是不可能的。
Asqiir

1
也许带有排列的正则表达式描述了具有有趣属性的一类语言,但是!在实践中我从来没有遇到过运算符的需要,并且我想很少有人拥有,因为它易于实现,而我却没有实现扩展正则表达式看到支持它。
reinierpost

16

所以我的问题是:

  • (为什么)我的证明错了吗?
  • 如果正确:为什么没有简单的方法来表达排列?

您的“证明”仅查看单个单词的排列,这些单词是有限的语言。

每种有限的语言都是常规的(例如,仅通过列出所有成员之间的一种|),但是有无限的常规语言(通常是更有趣的常规语言)。

一旦获得接受无限语言(即带*运算符的表达式或带循环的自动机)的正则表达式(或语法/自动机),构造便不再起作用(您将获得无限语法/自动机) )。

David Richerby的答案提供了一种普通语言的示例,其排列语言不再是普通语言-所有此类示例都是无限语言。


8

ΣñΣØ

因此从某种意义上讲,没有一种简洁的方法可以指定一个单词的所有排列。


Ω~(2n)ΣnmO(m)

L(xi,yi)1iñ

  • X一世ÿ一世大号
  • 一世ĴX一世ÿĴ大号XĴÿ一世大号

大号ñ大号一世X一世ÿ一世q一世X一世q一世qĴ一世Ĵq一世=qĴX一世ÿĴXĴÿ一世大号

大号ñσ1个σññ小号σ1个σññ/2X小号小号ÿ小号小号X小号ÿ小号大号ñ小号ŤX小号ÿŤ大号ñ大号ñññ/2=Ω2ñ/ñ


这是否意味着1)从理论上讲,可以使»abc«与所有{abc,acb,bac,bca,cab,cba}匹配,但是这样做效率不高,并且由于»abc«会以指数形式扩展至(abc | acb | bac | bca | cab | cba)?还是2)我需要的自动机类型无法指定给定单词的所有排列?
Asqiir

1
一个bC一个bC+一个Cd+b一个C+bC一个+C一个b+Cb一个1个+3+6+6+1个=17一个bCdËFGH一世Ĵ
Yuval Filmus

1
我的理解:理论上,正则语言能够接受排列(正则表达式也是如此)。根本没有像“ abc«”这样的“简单方法”来编写“ abc的排列”。(无论出于何种原因。)
Asqiir

1
是的,这是一个很好的总结。我看看是否可以为正则表达式提供一个更简单的参数。
Yuval Filmus

2
对于未来的读者:这不是正确的答案!(如果我错了,请纠正我。)寻找被接受的。
Asqiir

0

为什么没有办法在正则表达式中编写“置换”

规则无限语言(单词数量无限)的排列不一定是规则。因此,它不能写为正则表达式。

证明

想想语言(ab)*。(示例受David Richerby启发。)其排列之一是a*b*。这不是常规语言。qed。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.