我想生成以下语言:
L={a^nb^m| n+m=k ,n,m>=0}
表示常量k
。
我正在使用命名空间Regex
的类System.Text.RegularExpressions
。
我现在拥有的最佳解决方案是:
public void Match(string input, int k)
{
Regex regex = new Regex(@"a*b*");
Match match = regex.Match(input);
if(match.Length==k)
Console.WriteLine("Successfully");
else
Console.WriteLine("Don't match");
}
对于k=5
,以下输入成功:
"aaabb"
"aabbb"
"aaaaa"
例如,这不是:
"aaabbb"
"ab"
实现这一目标最优雅的方法是什么?
答案 0 :(得分:6)
你可以使用预见来实现它
k = 5
/^(?=.{5}$)a*b*$/
(?=.{5}$)
请等一下。确保字符串仅包含5个字符。
a*b*
匹配a
出现零次或多次,后跟零次或多次出现b
<强>测试强>
public static void Match(string input, int k)
{
Regex regex = new Regex(@"^(?=.{"+k+"}$)a*b*$");
Console.WriteLine(regex.IsMatch(input));
}
Match("aaabb", 5);
=> True
Match("aaabbb", 5);
=> False
答案 1 :(得分:1)
nu11p01n73R的答案使用前瞻,这是实际正则表达式中常用的,但不是理论正则表达式的一部分(其中连接,交替和Kleene星是唯一可用的运算符)。
对于这种情况,理论正则表达式没有干净的解决方案。您只能列出所有案例。例如,如果k = 5:
aaaaa|aaaab|aaabb|aabbb|abbbb|bbbbb
你最多可以通过分组来缩短它:
aaa(aa|ab|bb)|(aa|ab|bb)bbb
语言是正常的。 k
是常量,因此我们总是可以绘制一个2k + 1状态的状态机。
k = 5的例子:
缺少转换进入陷阱状态,该状态不是接受状态。