【问题标题】:Construct a regular expression to match the following language构造正则表达式以匹配以下语言
【发布时间】:2017-02-11 01:07:08
【问题描述】:

我正在做我的教授在讲座结束时分发的思考练习。问题是在给定特定语言定义的情况下构建 DFA。在我构建 DFA 之前,第一个思考练习就是将语言定义转换为正则表达式。

提供的字母是二进制 {0, 1}

语言定义很不正式:

定义二进制字符串集合的语言,其中每个长度为 3 的子字符串至少有一个零

因此,与此定义匹配的字符串示例为 0000011010 等等。

我的麻烦是想出一个正则表达式来匹配这个语言定义。我尝试在http://regexr.com/ 上玩,但我只发现'..0' 每三个字符匹配一次,最后一个零。我不确定如何以定义语言的方式匹配每个子字符串,或者是否可能。

有没有办法为这个问题构造正则表达式?

【问题讨论】:

    标签: regex finite-automata deterministic


    【解决方案1】:

    需要横向思考。不要为非正式语言定义实现正则表达式,而是为该定义所暗示的属性实现正则表达式。

    剧透(将鼠标悬停在其上以获取解决方案):

    提示 1:

    如果任意 3 长度的子字符串必须有一个 0-digit,那么在一行中不可能有 3 个数字是 1-digits。

    提示 2:

    这意味着在每个0-digit 之间最多有两个1-digits。

    提示 3:

    这使它成为一种语言,在 0-2 1-digits 之后,可能有无限数量的组,由 0-digit 和 0-2 1-digits 组成。

    解决方案:

    ^1{0,2}(01{0,2})*$,或者等价的,更数学的,^(11?)?(0(11?)?)*$

    【讨论】:

    • 这太好了,谢谢。如果字母表现在包含数字 2 但非正式语言没有改变,如何扩展这个正则表达式?
    • 重读提示,将“1”替换为“12”。有什么东西没有意义了吗? (这是一项任务;你自己尝试的越多,你学到的就越多。)
    • 提示的逻辑是有道理的,但我不知道如何将“12”表示为正则表达式模式
    • 典型的正则表达式:[12]。更基本的是,(1|2).
    • 我试过^[1(1|2)]{0,2}(0[1(1|2)]{0,2})*$,似乎成功了!只是出于对正则表达式的好奇,有没有办法精确匹配每 3 个字符一个零而不是至少一个零?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2020-08-26
    • 2021-09-21
    相关资源
    最近更新 更多