L = {A ^ NB ^ M | n + m = k,n,m> = 0}在C#中使用正则表达式

时间:2015-01-07 15:09:34

标签: c# regex

我想生成以下语言:

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"

实现这一目标最优雅的方法是什么?

2 个答案:

答案 0 :(得分:6)

你可以使用预见来实现它

k = 5

/^(?=.{5}$)a*b*$/
  • (?=.{5}$)请等一下。确保字符串仅包含5个字符。

  • a*b*匹配a出现零次或多次,后跟零次或多次出现b

Regex Demo

<强>测试

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的例子:

缺少转换进入陷阱状态,该状态不是接受状态。