簡體   English   中英

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

[英]L={a^nb^m| n+m=k ,n,m>=0} with Regular Expression in C#

我想要生成以下語言:

L={a^nb^m| n+m=k ,n,m>=0}

對於常數k

我正在使用名稱空間System.Text.RegularExpressions的類Regex

我現在最好的解決方案是:

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"

實現這一目標的最優雅方式是什么?

您可以使用展望來實現它

對於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

nu11p01n73R的答案使用了前瞻,這是實際正則表達式中常用的,但不是理論正則表達式的一部分(其中連接,交替和Kleene星是唯一可用的運算符)。

對於這種情況,在理論正則表達式中沒有干凈的解決方案。 您只能列出所有案例。 例如,如果k = 5:

aaaaa|aaaab|aaabb|aabbb|abbbb|bbbbb

你最多可以通過分組來縮短它:

aaa(aa|ab|bb)|(aa|ab|bb)bbb

語言是常規的。 k是一個常數,所以我們總是可以繪制一個2k + 1狀態的狀態機。

k = 5的示例:

丟失的轉換進入陷阱狀態,該狀態不是接受狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM