【问题标题】:Same occurence of 1 and 2, but with length < 1.000.0001 和 2 出现相同,但长度 < 1.000.000
【发布时间】:2018-03-14 23:11:57
【问题描述】:

所以我有以下任务,我必须解释是否可以按照这些约束构造正则表达式:

数字 N

我的任务不是实际编写正则表达式,而只是推理是否可行。

我的结论是这是完全可能的,但我必须在我的正则表达式中写下所有可能的字符串,这会非常长。

到目前为止,我有以下正则表达式:

(([3-9]*[1]{n}[3-9]*[2]{n}[3-9]*){0,1000})

n 迭代到它的最大长度 1.000.000

我知道迭代器不是常规语言中的“事物”。但是有没有一种更简单的方法来“迭代”n,而不必全部手动编写?

【问题讨论】:

  • 它不会影响答案,但在您的问题正文中,您的 N

标签: regex iteration regular-language


【解决方案1】:

我的结论是这是完全可能的,但我必须在我的正则表达式中写下每个可能的字符串,这会非常长。

对于有关理论的问题,它会非常长这一事实是无关紧要的。你是对的。任何有限的语言都是正则的。

我知道迭代器不是常规语言中的“事物”。但是有没有一种更简单的方法来“迭代”n,而不必全部手动编写?

不,没有。考虑如何为此构建状态机也许会有所帮助。

一种状态,即初始状态,是看到的1s 的数量和看到的2s 的数量相等的状态。
第二种状态是 12s 多一个。
第三种状态是21s 多一个。
第四种状态是比2s 多两个1s。等等……

说服自己不能组合任何这些状态应该相当简单,因为每个状态的有效剩余子字符串中没有重叠。因此,您将需要 >1000000 个状态,并且由于将正则表达式转换为状态机是相当直接的,因此正则表达式的复杂度不能低于状态机的复杂度。

当然,在编程时,您可以更有效地实现这一点。例如,您可以将 1s 和 2s 的计数存储在其他变量中。但是变量是状态机所没有的特性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 2023-04-01
    • 2018-02-24
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    相关资源
    最近更新 更多