当前位置 博文首页 > 广大菜鸟的博客:奇数个a和偶数个b正则表达式

    广大菜鸟的博客:奇数个a和偶数个b正则表达式

    作者:[db:作者] 时间:2021-09-16 22:22

    本文参考形式语言:含偶数个零和奇数个一的正则表达式

    先报答案:

     String pattern = "(a|b(bb|aa)*(ba|ab))(bb|aa|(ba|ab)(bb|aa)*(ba|ab))*";
    

    背景是这样:
    明天要考编译原理了,做到这样的一个题
    在这里插入图片描述
    不知道咋写这正则表达式,先看这答案的DFA妙啊,
    然后准备些正规表达式,这…,我不会
    上网百度了一波,有很多类似的形式语言:含偶数个零和奇数个一的正则表达式
    不过,他们直接放下面第二部分内容,我愣逼了,知道看到上面参考的那篇博客就开始理解了
    偶数个0和偶数个1的正则表达式是

    (00|11 | (01|10) (00|11)*  (01| 10))*
    

    在这里插入图片描述

    在这里插入图片描述
    我换成另一种方式,希望可以方便大家理解
    在这里插入图片描述
    如果,这还不能理解,直接实践检验真理

    public class Test{
        public static void main(String[]args){
            String[] test =new String[]{
                    "bab","bbabb","babb","bbab","baab","bbaabb","baabb","bbaab","baaab","bbaaabb","baaabb",
                    "bbaaab","baaba","bbaabba","baabba","bbaaba","abaab","abbaabb","abaabb","abbaab"
            };
            // 奇个a偶数个b
            String pattern = "(a|b(bb|aa)*(ba|ab))(bb|aa|(ba|ab)(bb|aa)*(ba|ab))*";
            //  偶数个a和偶数个b时
            //String pattern = "(aa|bb|(ab|ba)(aa|bb)*(ab|ba))*";
            for(String s:test) {
                System.out.println(s+"->"+s.matches(pattern));
            }
        }
    }
    

    但,我觉得太复杂,没有答案给的那个图那样简洁,希望评论区可以给个检验。

    cs