问题
没有简单的方法来获取正则表达式的排列。
- 排列:将单词 (“ aabc”)转换为另一个顺序,而无需更改数字或字母种类。
- 正则表达式:正则表达式。
进行验证:
- “不重复的正则表达式排列”假设这样做会更简单,那么答案将创建JavaScript代码而不是正则表达式。
- “如何查找给定文本中给定单词的所有排列” –答案也不使用正则表达式。
- “正则表达式匹配所有{1,2,3,4}而不重复” –答案使用了正则表达式,但它既不适应也不简单。
- 这个答案甚至声称:“正则表达式不能满足您的要求。它不能从字符串生成排列”。
我正在寻找的解决方案
它应具有以下形式:
- »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达到这一目的呢?这是一个有用的功能。
^(a()|a()|b()|c()){4}\2\3\4\5$
似乎工作(见regex101.com/r/9URPpg/4/tests)。