论述题:假设有文法A→AA | (A) |   
  (1)用自然语言描述这个文法生成的语言。
  (2)说明这个文法有二义性。 为以下的字符串集合编写正则表达式(写出分析步骤,单给个式子不得分),若没有正则表达式,则说明原因。
(1)有字母a和b组成的,包含偶数个a或偶数个b的串。
(2)由a和b组成的a和b数目相等的串。2个题目,求答案

解决方案 »

  1.   

    (1)有字母a和b组成的,包含偶数个a或偶数个b的串。
    只有式子不行?你要啥?测试代码?private static void TestRegex01()
    {
        string[] testList = new string[] { "ababb", "ababab" };
        Regex regExp = new Regex(@"^(?=([^a]*a[^a]*a[^a]*)+$)[ab]+$", RegexOptions.Compiled);
        foreach (string test in testList)
        {
            Console.WriteLine(test + " : " + (regExp.IsMatch(test) ? "符合" : "不符合"));
        }
    }
      

  2.   

    哦,没看完,还要求偶数个b啊。修改一下private static void TestRegex01()
    {
        string[] testList = new string[] { "ababaabb", "ababab" };
        Regex regExp = new Regex(@"^^(?=([^a]*a[^a]*a[^a]*)+$)(?=([^b]*b[^b]*b[^b]*)+$)[ab]+$", RegexOptions.Compiled);
        foreach (string test in testList)
        {
            Console.WriteLine(test + " : " + (regExp.IsMatch(test) ? "符合" : "不符合"));
        }
    }
    结果:
    ababaabb : 符合
    ababab : 不符合
      

  3.   

    本帖最后由 lxcnn 于 2010-07-10 17:04:43 编辑
      

  4.   

    遇到高手了。
    只求正解啊,能写下分析步骤更好啊,哈哈。
    可以的话,帮我看看第一大题
    “假设有文法A→AA | (A) |   
      (1)用自然语言描述这个文法生成的语言。
      (2)说明这个文法有二义性。”
      

  5.   

    解释一下好了:
    ^(?=([^a]*a[^a]*a[^a]*)+$)(?=([^b]*b[^b]*b[^b]*)+$)[ab]+$^表示头
    $表示尾
    (?=exp)顺序肯定环视,表示所在位置右侧能够匹配Expression,但结果不进行匹配,可以继续使用
    [^a]*表示不是a的字符任意多个,其实这里直接写b*也可以
    a表示常量字符a
    [^a]*a[^a]*a[^a]*表示2个a,整体用货号包住,用+修饰,表示这样的偶数a的情况任意多次重复
    $表示结束,^开始偶数个a后$
    同样的b也是类似的写法。
    可以简化为:
    ^(?=(b*ab*ab*)+$)(?=(a*ba*ba*)+$)[ab]+$
      

  6.   

    ^(a(?<o>)|b(?<-o>))+(?(o)(?!))$^$不说了
    a(?<o>)  分组,捕获一个a压栈,栈名为o
    b(?<-o>) 分组,捕获一个b出栈,栈名为o
    (a(?<o>)|b(?<-o>))+,a...b这样的组合多次重复至少1次。
    (?(o)(?!)) 如果任意一次o分组匹配失败,则整个表达式匹配失败。详见看真正的正则高手:过客兄的博客