我可以用交集缩短这个正则表达式吗?

时间:2012-12-13 19:07:53

标签: javascript regular-language string-length

我的语言L只包含一个字符串: enter image description here 写得更简洁enter image description here

此字符串有2(2 ^ n-1)个字符,我想减少它。 我正在考虑使用交集,如果我能找到一些常规语言,其正则表达式的交集会产生这个字符串。

我在这里有递归函数,以防有用:

function recursiveRegex(charset) {
if(charset.length == 0) {
    return [];
} else {
    var char = charset.splice(charset.length - 1, 1);
    var returnVal = recursiveRegex(charset);
    return returnVal.concat(returnVal) + char ;
}
}

console.log(recursiveRegex(['a1', 'a2', 'a3', 'a4']));

1 个答案:

答案 0 :(得分:3)

这不是常规语言,因此您无法找到定义语法的常规语法。

因此,这种语言没有正则表达式。

A_1: a_1

A_2: A_1 A_1 a_2

A_3: A_2 A_2 a_3

A_n: A_{n-1} A_{n-1} a_n

这个语法定义了你的语言,它不是常规语法。

这种语法没有定义常规语言的直接证据是,需要不止一定数量的内存位置来定义语言。对于给定的N,需要一个取决于N的数字来保留N字。


将每个左符号视为内存的位置。如果你想使它成为常规,你应该有有限数量的规则。如果你需要使它有限,那么应该这样做:

ATOM:a1

RULE_ {n + 1}:ATOM | RULE_n RULE_n a_ {n + 1}

要正确创建此语言,您需要一个计数器,以便了解每个时刻要插入的a_n。但是不可能使用常规语法创建任何类型的计数器。