论述题:假设有文法A→AA | (A) |
(1)用自然语言描述这个文法生成的语言。
(2)说明这个文法有二义性。 为以下的字符串集合编写正则表达式(写出分析步骤,单给个式子不得分),若没有正则表达式,则说明原因。
(1)有字母a和b组成的,包含偶数个a或偶数个b的串。
(2)由a和b组成的a和b数目相等的串。2个题目,求答案
(1)用自然语言描述这个文法生成的语言。
(2)说明这个文法有二义性。 为以下的字符串集合编写正则表达式(写出分析步骤,单给个式子不得分),若没有正则表达式,则说明原因。
(1)有字母a和b组成的,包含偶数个a或偶数个b的串。
(2)由a和b组成的a和b数目相等的串。2个题目,求答案
只有式子不行?你要啥?测试代码?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) ? "符合" : "不符合"));
}
}
{
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 : 不符合
只求正解啊,能写下分析步骤更好啊,哈哈。
可以的话,帮我看看第一大题
“假设有文法A→AA | (A) |
(1)用自然语言描述这个文法生成的语言。
(2)说明这个文法有二义性。”
^(?=([^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]+$
a(?<o>) 分组,捕获一个a压栈,栈名为o
b(?<-o>) 分组,捕获一个b出栈,栈名为o
(a(?<o>)|b(?<-o>))+,a...b这样的组合多次重复至少1次。
(?(o)(?!)) 如果任意一次o分组匹配失败,则整个表达式匹配失败。详见看真正的正则高手:过客兄的博客